diff --git a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/BridgeGenerator.kt b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/BridgeGenerator.kt
index b92e5db..44d5954 100644
--- a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/BridgeGenerator.kt
+++ b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/BridgeGenerator.kt
@@ -7,7 +7,6 @@
 
 import org.jetbrains.kotlin.sir.*
 import org.jetbrains.kotlin.sir.bridge.impl.*
-import org.jetbrains.kotlin.sir.providers.source.KotlinSource
 
 /**
  * Marker interface for all possible bridge requests.
@@ -112,8 +111,12 @@
 }
 
 public interface SirTypeNamer {
+    public enum class KotlinNameType {
+        FQN, PARAMETRIZED
+    }
+
     public fun swiftFqName(type: SirType): String
-    public fun kotlinFqName(type: SirType): String
+    public fun kotlinFqName(sirType: SirType, nameType: KotlinNameType): String
 }
 
 public fun createBridgeGenerator(namer: SirTypeNamer): BridgeGenerator =
diff --git a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/BridgeGeneratorImpl.kt b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/BridgeGeneratorImpl.kt
index 14ddbfc..be3058b 100644
--- a/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/BridgeGeneratorImpl.kt
+++ b/native/swift/sir-compiler-bridge/src/org/jetbrains/kotlin/sir/bridge/impl/BridgeGeneratorImpl.kt
@@ -102,7 +102,12 @@
                 add(
                     request.allocationDescriptor(typeNamer).createFunctionBridge {
                         val args = argNames(this)
-                        "kotlin.native.internal.createUninitializedInstance<$name>(${args.joinToString()})"
+                        "kotlin.native.internal.createUninitializedInstance<${
+                            typeNamer.kotlinFqName(
+                                request.callable.producingType,
+                                SirTypeNamer.KotlinNameType.PARAMETRIZED
+                            )
+                        }>(${args.joinToString()})"
                     }
                 )
                 if (request.callable.origin is InnerInitSource) {
@@ -127,7 +132,12 @@
                     add(
                         request.initializationDescriptor(typeNamer).createFunctionBridge {
                             val args = argNames(this)
-                            "kotlin.native.internal.initInstance(${args.first()}, ${name}(${args.drop(1).joinToString()}))"
+                            "kotlin.native.internal.initInstance(${args.first()}, ${
+                                typeNamer.kotlinFqName(
+                                    request.callable.producingType,
+                                    SirTypeNamer.KotlinNameType.PARAMETRIZED
+                                )
+                            }(${args.drop(1).joinToString()}))"
                         }
                     )
                 }
@@ -176,7 +186,7 @@
 
     private fun generateTypeBindingBridge(request: TypeBindingBridgeRequest): TypeBindingBridge {
         val annotationName = "kotlin.native.internal.objc.BindClassToObjCName"
-        val kotlinType = typeNamer.kotlinFqName(SirNominalType(request.sirTypeDeclaration))
+        val kotlinType = typeNamer.kotlinFqName(SirNominalType(request.sirTypeDeclaration), SirTypeNamer.KotlinNameType.FQN)
         val swiftName = request.sirTypeDeclaration.let {
             it.attributes.firstIsInstanceOrNull<SirAttribute.ObjC>()?.name ?: it.mangledNameOrNull
         }
@@ -644,7 +654,12 @@
         override val inKotlinSources = object : ValueConversion {
             // nulls are handled by AsOptionalWrapper, so safe to cast from nullable to non-nullable
             override fun swiftToKotlin(typeNamer: SirTypeNamer, valueExpression: String) =
-                "kotlin.native.internal.ref.dereferenceExternalRCRef($valueExpression) as ${typeNamer.kotlinFqName(swiftType)}"
+                "kotlin.native.internal.ref.dereferenceExternalRCRef($valueExpression) as ${
+                    typeNamer.kotlinFqName(
+                        swiftType,
+                        SirTypeNamer.KotlinNameType.PARAMETRIZED
+                    )
+                }"
 
             override fun kotlinToSwift(typeNamer: SirTypeNamer, valueExpression: String) =
                 "kotlin.native.internal.ref.createRetainedExternalRCRef($valueExpression)"
@@ -663,7 +678,12 @@
     class AsExistential(swiftType: SirExistentialType, kotlinType: KotlinType, cType: CType) : Bridge(swiftType, kotlinType, cType) {
         override val inKotlinSources = object : ValueConversion {
             override fun swiftToKotlin(typeNamer: SirTypeNamer, valueExpression: String) =
-                "kotlin.native.internal.ref.dereferenceExternalRCRef($valueExpression) as ${typeNamer.kotlinFqName(swiftType)}"
+                "kotlin.native.internal.ref.dereferenceExternalRCRef($valueExpression) as ${
+                    typeNamer.kotlinFqName(
+                        swiftType,
+                        SirTypeNamer.KotlinNameType.FQN
+                    )
+                }"
 
             override fun kotlinToSwift(typeNamer: SirTypeNamer, valueExpression: String) =
                 "kotlin.native.internal.ref.createRetainedExternalRCRef($valueExpression)"
@@ -700,7 +720,7 @@
     ) : Bridge(swiftType, KotlinType.ObjCObjectUnretained, cType) {
         override val inKotlinSources = object : ValueConversion {
             override fun swiftToKotlin(typeNamer: SirTypeNamer, valueExpression: String): String =
-                "interpretObjCPointer<${typeNamer.kotlinFqName(swiftType)}>($valueExpression)"
+                "interpretObjCPointer<${typeNamer.kotlinFqName(swiftType, SirTypeNamer.KotlinNameType.PARAMETRIZED)}>($valueExpression)"
 
             override fun kotlinToSwift(typeNamer: SirTypeNamer, valueExpression: String) =
                 "$valueExpression.objcPtr()"
@@ -925,7 +945,18 @@
                     val argsInClosure = parameters
                         .mapIndexed { idx, el -> "arg${idx}" to el }.takeIf { it.isNotEmpty() }
                     val defineArgs = argsInClosure
-                        ?.let { " ${it.joinToString { "${it.first}: ${typeNamer.kotlinFqName(it.second.swiftType)}" }} ->" }
+                        ?.let {
+                            " ${
+                                it.joinToString {
+                                    "${it.first}: ${
+                                        typeNamer.kotlinFqName(
+                                            it.second.swiftType,
+                                            SirTypeNamer.KotlinNameType.PARAMETRIZED
+                                        )
+                                    }"
+                                }
+                            } ->"
+                        }
                     val callArgs = argsInClosure
                         ?.let { it.joinToString { it.second.inKotlinSources.kotlinToSwift(typeNamer, it.first) } } ?: ""
                     return """run {    
@@ -1070,3 +1101,7 @@
 
 private val BridgeFunctionDescriptor.safeImportName: String
     get() = kotlinFqName.run { if (size <= 1) single() else joinToString("_") { it.replace("_", "__") } }
+
+private val SirInit.producingType: SirType get() = SirNominalType(
+        parent as? SirNamedDeclaration ?: error("Encountered an Init that produces non-named type: $parent")
+    )
diff --git a/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt b/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt
index f280baf..932f77d 100644
--- a/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt
+++ b/native/swift/sir-compiler-bridge/test/org/jetbrains/kotlin/sir/bridge/AbstractKotlinSirBridgeTest.kt
@@ -61,17 +61,17 @@
                         }
                     }
 
-                    override fun kotlinFqName(type: SirType): String {
-                        return when (type) {
+                    override fun kotlinFqName(sirType: SirType, nameType: SirTypeNamer.KotlinNameType): String {
+                        return when (sirType) {
                             is SirNominalType -> {
-                                require(type.typeDeclaration.origin is SirOrigin.ExternallyDefined)
-                                type.typeDeclaration.name
+                                require(sirType.typeDeclaration.origin is SirOrigin.ExternallyDefined)
+                                sirType.typeDeclaration.name
                             }
                             is SirFunctionalType -> {
                                 // todo: KT-72993
-                                (listOf("function") + type.parameterTypes.map { kotlinFqName(it) }).joinToString("_")
+                                (listOf("function") + sirType.parameterTypes.map { kotlinFqName(it, SirTypeNamer.KotlinNameType.FQN) }).joinToString("_")
                             }
-                            else -> error("Unsupported type: $type")
+                            else -> error("Unsupported type: $sirType")
                         }
                     }
                 })
diff --git a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt
index 42e564f..89721a5 100644
--- a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt
+++ b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/nodes/SirClassFromKtSymbol.kt
@@ -152,7 +152,7 @@
     private fun syntheticDeclarations(): List<SirDeclaration> = when (ktSymbol.classKind) {
         KaClassKind.OBJECT, KaClassKind.COMPANION_OBJECT -> listOf(
             kotlinBaseInitDeclaration(),
-            SirObjectSyntheticInit(ktSymbol),
+            SirObjectSyntheticInit(ktSymbol = ktSymbol),
             buildVariable {
                 origin = SirOrigin.ObjectAccessor(`for` = KotlinSource(ktSymbol))
                 visibility = SirVisibility.PUBLIC
@@ -194,7 +194,9 @@
     }
 }
 
-internal class SirObjectSyntheticInit(ktSymbol: KaNamedClassSymbol) : SirInit() {
+internal class SirObjectSyntheticInit(
+    ktSymbol: KaNamedClassSymbol,
+) : SirInit() {
     override val origin: SirOrigin = SirOrigin.PrivateObjectInit(`for` = KotlinSource(ktSymbol))
     override val visibility: SirVisibility = SirVisibility.PRIVATE
     override val isFailable: Boolean = false
diff --git a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/utils/SirOperatorTranslationStrategy.kt b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/utils/SirOperatorTranslationStrategy.kt
index 267c171..f12ed30 100644
--- a/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/utils/SirOperatorTranslationStrategy.kt
+++ b/native/swift/sir-light-classes/src/org/jetbrains/sir/lightclasses/utils/SirOperatorTranslationStrategy.kt
@@ -59,7 +59,7 @@
                     "get", "set" -> AsSubscriptAccessor(kaSymbol)
 
                     // Unsupported; iterators
-                    "iterator" -> AsIsWithAdditions(kaSymbol)
+                    "iterator", "next", "hasNext" -> AsIsWithAdditions(kaSymbol)
 
                     // Misc
                     "contains" -> AsIsWithAdditions(kaSymbol) { listOf(SirBinaryMathOperatorTrampolineFunction(it, "~=")) }
diff --git a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/SirVisibilityCheckerImpl.kt b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/SirVisibilityCheckerImpl.kt
index b7df439..e65765f 100644
--- a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/SirVisibilityCheckerImpl.kt
+++ b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/impl/SirVisibilityCheckerImpl.kt
@@ -174,11 +174,6 @@
             return@withSessions SirAvailability.Hidden("Some super type isn't available")
         }
 
-        if (hasTypeParameter(this)) {
-            unsupportedDeclarationReporter.report(this@isExported, "generics are not supported yet.")
-            return@withSessions SirAvailability.Unavailable("Has type parameter(s)")
-        }
-
         if (isInline) {
             unsupportedDeclarationReporter.report(this@isExported, "inline classes are not supported yet.")
             return@withSessions SirAvailability.Unavailable("Inline classes are not supported")
diff --git a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/AnalysisApiUtils.kt b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/AnalysisApiUtils.kt
index ab59ab8..07a8579 100644
--- a/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/AnalysisApiUtils.kt
+++ b/native/swift/sir-providers/src/org/jetbrains/kotlin/sir/providers/utils/AnalysisApiUtils.kt
@@ -11,7 +11,6 @@
 import org.jetbrains.kotlin.builtins.StandardNames
 import org.jetbrains.kotlin.name.ClassId
 import org.jetbrains.kotlin.name.FqName
-import org.jetbrains.kotlin.name.Name
 import org.jetbrains.kotlin.name.StandardClassIds
 import kotlin.Throws
 
@@ -52,4 +51,4 @@
             ?.values?.filterIsInstance<KaAnnotationValue.ClassLiteralValue>()
 
         Throws()
-    }
\ No newline at end of file
+    }
diff --git a/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift b/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift
index b4aba2a..c10c42b 100644
--- a/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift
+++ b/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift
@@ -1,7 +1,7 @@
 public enum kotlin {
     public enum collections {
     }
-    public enum time {
+    public enum ranges {
     }
 }
 public enum kotlinx {
diff --git a/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinSerialization/KotlinSerialization.h b/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinSerialization/KotlinSerialization.h
index 5a12dc7..f669df8 100644
--- a/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinSerialization/KotlinSerialization.h
+++ b/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinSerialization/KotlinSerialization.h
@@ -3,6 +3,22 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
+void * _Nullable kotlinx_serialization_BinaryFormat_decodeFromByteArray__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_ExportedKotlinPackages_kotlin_ByteArray__(void * self, void * deserializer, void * bytes);
+
+void * kotlinx_serialization_BinaryFormat_encodeToByteArray__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * serializer, void * _Nullable value);
+
+void * kotlinx_serialization_ContextualSerializer_descriptor_get(void * self);
+
+void * kotlinx_serialization_ContextualSerializer_deserialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder__(void * self, void * decoder);
+
+void kotlinx_serialization_ContextualSerializer_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_KotlinRuntime_KotlinBase__(void * self, void * encoder, void * value);
+
+void * kotlinx_serialization_DeserializationStrategy_descriptor_get(void * self);
+
+void * _Nullable kotlinx_serialization_DeserializationStrategy_deserialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder__(void * self, void * decoder);
+
+void * kotlinx_serialization_KSerializer_descriptor_get(void * self);
+
 void * kotlinx_serialization_MissingFieldException_init_allocate();
 
 void kotlinx_serialization_MissingFieldException_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Array_Swift_String__Swift_String__(void * __kt, NSArray<NSString *> * missingFields, NSString * serialName);
@@ -13,6 +29,16 @@
 
 NSArray<NSString *> * kotlinx_serialization_MissingFieldException_missingFields_get(void * self);
 
+void * kotlinx_serialization_PolymorphicSerializer_descriptor_get(void * self);
+
+NSString * kotlinx_serialization_PolymorphicSerializer_toString(void * self);
+
+void * kotlinx_serialization_SealedClassSerializer_descriptor_get(void * self);
+
+void * _Nullable kotlinx_serialization_SealedClassSerializer_findPolymorphicSerializerOrNull__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Optional_Swift_String___(void * self, void * decoder, NSString * _Nullable klassName);
+
+void * _Nullable kotlinx_serialization_SealedClassSerializer_findPolymorphicSerializerOrNull__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_KotlinRuntime_KotlinBase__(void * self, void * encoder, void * value);
+
 void * kotlinx_serialization_SerialFormat_serializersModule_get(void * self);
 
 void * kotlinx_serialization_SerializationException_init_allocate();
@@ -25,6 +51,84 @@
 
 void kotlinx_serialization_SerializationException_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_ExportedKotlinPackages_kotlin_Throwable___(void * __kt, void * _Nullable cause);
 
+void * kotlinx_serialization_SerializationStrategy_descriptor_get(void * self);
+
+void kotlinx_serialization_SerializationStrategy_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * encoder, void * _Nullable value);
+
+void * _Nullable kotlinx_serialization_StringFormat_decodeFromString__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_String__(void * self, void * deserializer, NSString * string);
+
+NSString * kotlinx_serialization_StringFormat_encodeToString__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * serializer, void * _Nullable value);
+
+void * kotlinx_serialization_builtins_BooleanArraySerializer();
+
+void * kotlinx_serialization_builtins_ByteArraySerializer();
+
+void * kotlinx_serialization_builtins_CharArraySerializer();
+
+void * kotlinx_serialization_builtins_DoubleArraySerializer();
+
+void * kotlinx_serialization_builtins_FloatArraySerializer();
+
+void * kotlinx_serialization_builtins_IntArraySerializer();
+
+void * kotlinx_serialization_builtins_ListSerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(void * elementSerializer);
+
+void * kotlinx_serialization_builtins_LongArraySerializer();
+
+void * kotlinx_serialization_builtins_LongAsStringSerializer_descriptor_get(void * self);
+
+int64_t kotlinx_serialization_builtins_LongAsStringSerializer_deserialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder__(void * self, void * decoder);
+
+void * kotlinx_serialization_builtins_LongAsStringSerializer_get();
+
+void kotlinx_serialization_builtins_LongAsStringSerializer_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_Swift_Int64__(void * self, void * encoder, int64_t value);
+
+void * kotlinx_serialization_builtins_MapEntrySerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(void * keySerializer, void * valueSerializer);
+
+void * kotlinx_serialization_builtins_MapSerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(void * keySerializer, void * valueSerializer);
+
+void * kotlinx_serialization_builtins_NothingSerializer();
+
+void * kotlinx_serialization_builtins_PairSerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(void * keySerializer, void * valueSerializer);
+
+void * kotlinx_serialization_builtins_SetSerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(void * elementSerializer);
+
+void * kotlinx_serialization_builtins_ShortArraySerializer();
+
+void * kotlinx_serialization_builtins_TripleSerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(void * aSerializer, void * bSerializer, void * cSerializer);
+
+void * kotlinx_serialization_builtins_UByteArraySerializer();
+
+void * kotlinx_serialization_builtins_UIntArraySerializer();
+
+void * kotlinx_serialization_builtins_ULongArraySerializer();
+
+void * kotlinx_serialization_builtins_UShortArraySerializer();
+
+void * kotlinx_serialization_builtins_nullable_get__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(void * receiver);
+
+void * kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Boolean_Companion__(void * receiver);
+
+void * kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Byte_Companion__(void * receiver);
+
+void * kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Char_Companion__(void * receiver);
+
+void * kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Double_Companion__(void * receiver);
+
+void * kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Float_Companion__(void * receiver);
+
+void * kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Int_Companion__(void * receiver);
+
+void * kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Long_Companion__(void * receiver);
+
+void * kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Short_Companion__(void * receiver);
+
+void * kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_String_Companion__(void * receiver);
+
+void * kotlinx_serialization_builtins_serializer__TypesOfArguments__Swift_Void__(void receiver);
+
+void * _Nullable kotlinx_serialization_decodeFromHexString__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_BinaryFormat_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_String__(void * receiver, void * deserializer, NSString * hex);
+
 NSArray<id> * kotlinx_serialization_descriptors_ClassSerialDescriptorBuilder_annotations_get(void * self);
 
 void kotlinx_serialization_descriptors_ClassSerialDescriptorBuilder_annotations_set__TypesOfArguments__Swift_Array_anyU20ExportedKotlinPackages_kotlin_Annotation___(void * self, NSArray<id> * newValue);
@@ -105,6 +209,10 @@
 
 void * kotlinx_serialization_descriptors_buildSerialDescriptor__TypesOfArguments__Swift_String_ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialKind_anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_U28ExportedKotlinPackages_kotlinx_serialization_descriptors_ClassSerialDescriptorBuilderU29202D_U20Swift_Void__(NSString * serialName, void * kind, void * typeParameters, void (^builder)(void *));
 
+void * kotlinx_serialization_descriptors_elementDescriptors_get__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * receiver);
+
+void * kotlinx_serialization_descriptors_elementNames_get__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * receiver);
+
 void * _Nullable kotlinx_serialization_descriptors_getContextualDescriptor__TypesOfArguments__ExportedKotlinPackages_kotlinx_serialization_modules_SerializersModule_anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * receiver, void * descriptor);
 
 NSArray<id> * kotlinx_serialization_descriptors_getPolymorphicDescriptors__TypesOfArguments__ExportedKotlinPackages_kotlinx_serialization_modules_SerializersModule_anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * receiver, void * descriptor);
@@ -117,6 +225,8 @@
 
 void * kotlinx_serialization_descriptors_setSerialDescriptor__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * elementDescriptor);
 
+NSString * kotlinx_serialization_encodeToHexString__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_BinaryFormat_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * receiver, void * serializer, void * _Nullable value);
+
 void * kotlinx_serialization_encoding_AbstractDecoder_beginStructure__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * descriptor);
 
 _Bool kotlinx_serialization_encoding_AbstractDecoder_decodeBoolean(void * self);
@@ -157,6 +267,12 @@
 
 void kotlinx_serialization_encoding_AbstractDecoder_decodeNull(void * self);
 
+void * _Nullable kotlinx_serialization_encoding_AbstractDecoder_decodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * deserializer, void * _Nullable previousValue);
+
+void * _Nullable kotlinx_serialization_encoding_AbstractDecoder_decodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * deserializer, void * _Nullable previousValue);
+
+void * _Nullable kotlinx_serialization_encoding_AbstractDecoder_decodeSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * deserializer, void * _Nullable previousValue);
+
 int16_t kotlinx_serialization_encoding_AbstractDecoder_decodeShort(void * self);
 
 int16_t kotlinx_serialization_encoding_AbstractDecoder_decodeShortElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
@@ -209,6 +325,10 @@
 
 void kotlinx_serialization_encoding_AbstractEncoder_encodeNull(void * self);
 
+void kotlinx_serialization_encoding_AbstractEncoder_encodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * serializer, void * _Nullable value);
+
+void kotlinx_serialization_encoding_AbstractEncoder_encodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * serializer, void * _Nullable value);
+
 void kotlinx_serialization_encoding_AbstractEncoder_encodeShort__TypesOfArguments__Swift_Int16__(void * self, int16_t value);
 
 void kotlinx_serialization_encoding_AbstractEncoder_encodeShortElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Int16__(void * self, void * descriptor, int32_t index, int16_t value);
@@ -249,8 +369,12 @@
 
 int64_t kotlinx_serialization_encoding_CompositeDecoder_decodeLongElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
 
+void * _Nullable kotlinx_serialization_encoding_CompositeDecoder_decodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * deserializer, void * _Nullable previousValue);
+
 _Bool kotlinx_serialization_encoding_CompositeDecoder_decodeSequentially(void * self);
 
+void * _Nullable kotlinx_serialization_encoding_CompositeDecoder_decodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * deserializer, void * _Nullable previousValue);
+
 int16_t kotlinx_serialization_encoding_CompositeDecoder_decodeShortElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
 
 NSString * kotlinx_serialization_encoding_CompositeDecoder_decodeStringElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
@@ -275,6 +399,10 @@
 
 void kotlinx_serialization_encoding_CompositeEncoder_encodeLongElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Int64__(void * self, void * descriptor, int32_t index, int64_t value);
 
+void kotlinx_serialization_encoding_CompositeEncoder_encodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * serializer, void * _Nullable value);
+
+void kotlinx_serialization_encoding_CompositeEncoder_encodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * serializer, void * _Nullable value);
+
 void kotlinx_serialization_encoding_CompositeEncoder_encodeShortElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Int16__(void * self, void * descriptor, int32_t index, int16_t value);
 
 void kotlinx_serialization_encoding_CompositeEncoder_encodeStringElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_String__(void * self, void * descriptor, int32_t index, NSString * value);
@@ -309,6 +437,10 @@
 
 void kotlinx_serialization_encoding_Decoder_decodeNull(void * self);
 
+void * _Nullable kotlinx_serialization_encoding_Decoder_decodeNullableSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy__(void * self, void * deserializer);
+
+void * _Nullable kotlinx_serialization_encoding_Decoder_decodeSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy__(void * self, void * deserializer);
+
 int16_t kotlinx_serialization_encoding_Decoder_decodeShort(void * self);
 
 NSString * kotlinx_serialization_encoding_Decoder_decodeString(void * self);
@@ -341,12 +473,52 @@
 
 void kotlinx_serialization_encoding_Encoder_encodeNull(void * self);
 
+void kotlinx_serialization_encoding_Encoder_encodeNullableSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * serializer, void * _Nullable value);
+
+void kotlinx_serialization_encoding_Encoder_encodeSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * serializer, void * _Nullable value);
+
 void kotlinx_serialization_encoding_Encoder_encodeShort__TypesOfArguments__Swift_Int16__(void * self, int16_t value);
 
 void kotlinx_serialization_encoding_Encoder_encodeString__TypesOfArguments__Swift_String__(void * self, NSString * value);
 
 void * kotlinx_serialization_encoding_Encoder_serializersModule_get(void * self);
 
+void * kotlinx_serialization_findPolymorphicSerializer__TypesOfArguments__ExportedKotlinPackages_kotlinx_serialization_U60internalU60_AbstractPolymorphicSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Optional_Swift_String___(void * receiver, void * decoder, NSString * _Nullable klassName);
+
+void * kotlinx_serialization_findPolymorphicSerializer__TypesOfArguments__ExportedKotlinPackages_kotlinx_serialization_U60internalU60_AbstractPolymorphicSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_KotlinRuntime_KotlinBase__(void * receiver, void * encoder, void * value);
+
+void * _Nullable kotlinx_serialization_internal_AbstractCollectionSerializer_builder(void * self);
+
+int32_t kotlinx_serialization_internal_AbstractCollectionSerializer_builderSize__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable receiver);
+
+void kotlinx_serialization_internal_AbstractCollectionSerializer_checkCapacity__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int32__(void * self, void * _Nullable receiver, int32_t size);
+
+void * kotlinx_serialization_internal_AbstractCollectionSerializer_collectionIterator__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable receiver);
+
+int32_t kotlinx_serialization_internal_AbstractCollectionSerializer_collectionSize__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable receiver);
+
+void * _Nullable kotlinx_serialization_internal_AbstractCollectionSerializer_deserialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder__(void * self, void * decoder);
+
+void * _Nullable kotlinx_serialization_internal_AbstractCollectionSerializer_merge__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * decoder, void * _Nullable previous);
+
+void kotlinx_serialization_internal_AbstractCollectionSerializer_readAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int32_Swift_Int32__(void * self, void * decoder, void * _Nullable builder, int32_t startIndex, int32_t size);
+
+void kotlinx_serialization_internal_AbstractCollectionSerializer_readElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Int32_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Bool__(void * self, void * decoder, int32_t index, void * _Nullable builder, _Bool checkIndex);
+
+void kotlinx_serialization_internal_AbstractCollectionSerializer_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * encoder, void * _Nullable value);
+
+void * _Nullable kotlinx_serialization_internal_AbstractCollectionSerializer_toBuilder__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable receiver);
+
+void * _Nullable kotlinx_serialization_internal_AbstractCollectionSerializer_toResult__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable receiver);
+
+void * kotlinx_serialization_internal_AbstractPolymorphicSerializer_deserialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder__(void * self, void * decoder);
+
+void * _Nullable kotlinx_serialization_internal_AbstractPolymorphicSerializer_findPolymorphicSerializerOrNull__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Optional_Swift_String___(void * self, void * decoder, NSString * _Nullable klassName);
+
+void * _Nullable kotlinx_serialization_internal_AbstractPolymorphicSerializer_findPolymorphicSerializerOrNull__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_KotlinRuntime_KotlinBase__(void * self, void * encoder, void * value);
+
+void kotlinx_serialization_internal_AbstractPolymorphicSerializer_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_KotlinRuntime_KotlinBase__(void * self, void * encoder, void * value);
+
 void * kotlinx_serialization_internal_ElementMarker_init_allocate();
 
 void kotlinx_serialization_internal_ElementMarker_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_U28anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_U20Swift_Int32U29202D_U20Swift_Bool__(void * __kt, void * descriptor, _Bool (^readIfAbsent)(void *, int32_t));
@@ -355,6 +527,236 @@
 
 int32_t kotlinx_serialization_internal_ElementMarker_nextUnmarkedIndex(void * self);
 
+void * kotlinx_serialization_internal_GeneratedSerializer_childSerializers(void * self);
+
+void * kotlinx_serialization_internal_GeneratedSerializer_typeParametersSerializers(void * self);
+
+void * kotlinx_serialization_internal_InlinePrimitiveDescriptor__TypesOfArguments__Swift_String_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(NSString * name, void * primitiveSerializer);
+
+void * kotlinx_serialization_internal_MapLikeSerializer_descriptor_get(void * self);
+
+void kotlinx_serialization_internal_MapLikeSerializer_insertKeyValuePair__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_MutableMap_Swift_Int32_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * receiver, int32_t index, void * _Nullable key, void * _Nullable value);
+
+void * kotlinx_serialization_internal_MapLikeSerializer_keySerializer_get(void * self);
+
+void kotlinx_serialization_internal_MapLikeSerializer_readAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_anyU20ExportedKotlinPackages_kotlin_collections_MutableMap_Swift_Int32_Swift_Int32__(void * self, void * decoder, void * builder, int32_t startIndex, int32_t size);
+
+void kotlinx_serialization_internal_MapLikeSerializer_readElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Int32_anyU20ExportedKotlinPackages_kotlin_collections_MutableMap_Swift_Bool__(void * self, void * decoder, int32_t index, void * builder, _Bool checkIndex);
+
+void kotlinx_serialization_internal_MapLikeSerializer_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * encoder, void * _Nullable value);
+
+void * kotlinx_serialization_internal_MapLikeSerializer_valueSerializer_get(void * self);
+
+NSString * kotlinx_serialization_internal_NamedValueDecoder_composeName__TypesOfArguments__Swift_String_Swift_String__(void * self, NSString * parentName, NSString * childName);
+
+NSString * kotlinx_serialization_internal_NamedValueDecoder_elementName__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+NSString * kotlinx_serialization_internal_NamedValueDecoder_getTag__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * receiver, int32_t index);
+
+NSString * kotlinx_serialization_internal_NamedValueDecoder_nested__TypesOfArguments__Swift_String__(void * self, NSString * nestedName);
+
+NSString * kotlinx_serialization_internal_NamedValueEncoder_composeName__TypesOfArguments__Swift_String_Swift_String__(void * self, NSString * parentName, NSString * childName);
+
+NSString * kotlinx_serialization_internal_NamedValueEncoder_elementName__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+NSString * kotlinx_serialization_internal_NamedValueEncoder_getTag__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * receiver, int32_t index);
+
+NSString * kotlinx_serialization_internal_NamedValueEncoder_nested__TypesOfArguments__Swift_String__(void * self, NSString * nestedName);
+
+void * kotlinx_serialization_internal_TaggedDecoder_beginStructure__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * descriptor);
+
+void kotlinx_serialization_internal_TaggedDecoder_copyTagsTo__TypesOfArguments__ExportedKotlinPackages_kotlinx_serialization_U60internalU60_TaggedDecoder__(void * self, void * other);
+
+void * _Nullable kotlinx_serialization_internal_TaggedDecoder_currentTagOrNull_get(void * self);
+
+void * _Nullable kotlinx_serialization_internal_TaggedDecoder_currentTag_get(void * self);
+
+_Bool kotlinx_serialization_internal_TaggedDecoder_decodeBoolean(void * self);
+
+_Bool kotlinx_serialization_internal_TaggedDecoder_decodeBooleanElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+int8_t kotlinx_serialization_internal_TaggedDecoder_decodeByte(void * self);
+
+int8_t kotlinx_serialization_internal_TaggedDecoder_decodeByteElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+uint16_t kotlinx_serialization_internal_TaggedDecoder_decodeChar(void * self);
+
+uint16_t kotlinx_serialization_internal_TaggedDecoder_decodeCharElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+double kotlinx_serialization_internal_TaggedDecoder_decodeDouble(void * self);
+
+double kotlinx_serialization_internal_TaggedDecoder_decodeDoubleElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+int32_t kotlinx_serialization_internal_TaggedDecoder_decodeEnum__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * enumDescriptor);
+
+float kotlinx_serialization_internal_TaggedDecoder_decodeFloat(void * self);
+
+float kotlinx_serialization_internal_TaggedDecoder_decodeFloatElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+void * kotlinx_serialization_internal_TaggedDecoder_decodeInline__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * descriptor);
+
+void * kotlinx_serialization_internal_TaggedDecoder_decodeInlineElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+int32_t kotlinx_serialization_internal_TaggedDecoder_decodeInt(void * self);
+
+int32_t kotlinx_serialization_internal_TaggedDecoder_decodeIntElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+int64_t kotlinx_serialization_internal_TaggedDecoder_decodeLong(void * self);
+
+int64_t kotlinx_serialization_internal_TaggedDecoder_decodeLongElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+_Bool kotlinx_serialization_internal_TaggedDecoder_decodeNotNullMark(void * self);
+
+void kotlinx_serialization_internal_TaggedDecoder_decodeNull(void * self);
+
+void * _Nullable kotlinx_serialization_internal_TaggedDecoder_decodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * deserializer, void * _Nullable previousValue);
+
+void * _Nullable kotlinx_serialization_internal_TaggedDecoder_decodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * deserializer, void * _Nullable previousValue);
+
+void * _Nullable kotlinx_serialization_internal_TaggedDecoder_decodeSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * deserializer, void * _Nullable previousValue);
+
+int16_t kotlinx_serialization_internal_TaggedDecoder_decodeShort(void * self);
+
+int16_t kotlinx_serialization_internal_TaggedDecoder_decodeShortElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+NSString * kotlinx_serialization_internal_TaggedDecoder_decodeString(void * self);
+
+NSString * kotlinx_serialization_internal_TaggedDecoder_decodeStringElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+_Bool kotlinx_serialization_internal_TaggedDecoder_decodeTaggedBoolean__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+int8_t kotlinx_serialization_internal_TaggedDecoder_decodeTaggedByte__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+uint16_t kotlinx_serialization_internal_TaggedDecoder_decodeTaggedChar__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+double kotlinx_serialization_internal_TaggedDecoder_decodeTaggedDouble__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+int32_t kotlinx_serialization_internal_TaggedDecoder_decodeTaggedEnum__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * _Nullable tag, void * enumDescriptor);
+
+float kotlinx_serialization_internal_TaggedDecoder_decodeTaggedFloat__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+void * kotlinx_serialization_internal_TaggedDecoder_decodeTaggedInline__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * _Nullable tag, void * inlineDescriptor);
+
+int32_t kotlinx_serialization_internal_TaggedDecoder_decodeTaggedInt__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+int64_t kotlinx_serialization_internal_TaggedDecoder_decodeTaggedLong__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+_Bool kotlinx_serialization_internal_TaggedDecoder_decodeTaggedNotNullMark__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+void kotlinx_serialization_internal_TaggedDecoder_decodeTaggedNull__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+int16_t kotlinx_serialization_internal_TaggedDecoder_decodeTaggedShort__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+NSString * kotlinx_serialization_internal_TaggedDecoder_decodeTaggedString__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+void * kotlinx_serialization_internal_TaggedDecoder_decodeTaggedValue__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+void kotlinx_serialization_internal_TaggedDecoder_endStructure__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * descriptor);
+
+void * _Nullable kotlinx_serialization_internal_TaggedDecoder_getTag__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * receiver, int32_t index);
+
+void * _Nullable kotlinx_serialization_internal_TaggedDecoder_popTag(void * self);
+
+void kotlinx_serialization_internal_TaggedDecoder_pushTag__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable name);
+
+void * kotlinx_serialization_internal_TaggedDecoder_serializersModule_get(void * self);
+
+void * kotlinx_serialization_internal_TaggedEncoder_beginStructure__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * descriptor);
+
+void * _Nullable kotlinx_serialization_internal_TaggedEncoder_currentTagOrNull_get(void * self);
+
+void * _Nullable kotlinx_serialization_internal_TaggedEncoder_currentTag_get(void * self);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeBoolean__TypesOfArguments__Swift_Bool__(void * self, _Bool value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeBooleanElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Bool__(void * self, void * descriptor, int32_t index, _Bool value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeByte__TypesOfArguments__Swift_Int8__(void * self, int8_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeByteElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Int8__(void * self, void * descriptor, int32_t index, int8_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeChar__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(void * self, uint16_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeCharElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Unicode_UTF16_CodeUnit__(void * self, void * descriptor, int32_t index, uint16_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeDouble__TypesOfArguments__Swift_Double__(void * self, double value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeDoubleElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Double__(void * self, void * descriptor, int32_t index, double value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeEnum__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * enumDescriptor, int32_t index);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeFloat__TypesOfArguments__Swift_Float__(void * self, float value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeFloatElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Float__(void * self, void * descriptor, int32_t index, float value);
+
+void * kotlinx_serialization_internal_TaggedEncoder_encodeInline__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * descriptor);
+
+void * kotlinx_serialization_internal_TaggedEncoder_encodeInlineElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * descriptor, int32_t index);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeInt__TypesOfArguments__Swift_Int32__(void * self, int32_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeIntElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Int32__(void * self, void * descriptor, int32_t index, int32_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeLong__TypesOfArguments__Swift_Int64__(void * self, int64_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeLongElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Int64__(void * self, void * descriptor, int32_t index, int64_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeNotNullMark(void * self);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeNull(void * self);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * serializer, void * _Nullable value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * descriptor, int32_t index, void * serializer, void * _Nullable value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeShort__TypesOfArguments__Swift_Int16__(void * self, int16_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeShortElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Int16__(void * self, void * descriptor, int32_t index, int16_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeString__TypesOfArguments__Swift_String__(void * self, NSString * value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeStringElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_String__(void * self, void * descriptor, int32_t index, NSString * value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedBoolean__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Bool__(void * self, void * _Nullable tag, _Bool value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedByte__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int8__(void * self, void * _Nullable tag, int8_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedChar__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Unicode_UTF16_CodeUnit__(void * self, void * _Nullable tag, uint16_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedDouble__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Double__(void * self, void * _Nullable tag, double value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedEnum__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * _Nullable tag, void * enumDescriptor, int32_t ordinal);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedFloat__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Float__(void * self, void * _Nullable tag, float value);
+
+void * kotlinx_serialization_internal_TaggedEncoder_encodeTaggedInline__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * _Nullable tag, void * inlineDescriptor);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedInt__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int32__(void * self, void * _Nullable tag, int32_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedLong__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int64__(void * self, void * _Nullable tag, int64_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedNonNullMark__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedNull__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable tag);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedShort__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int16__(void * self, void * _Nullable tag, int16_t value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedString__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_String__(void * self, void * _Nullable tag, NSString * value);
+
+void kotlinx_serialization_internal_TaggedEncoder_encodeTaggedValue__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__KotlinRuntime_KotlinBase__(void * self, void * _Nullable tag, void * value);
+
+void kotlinx_serialization_internal_TaggedEncoder_endEncode__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * descriptor);
+
+void kotlinx_serialization_internal_TaggedEncoder_endStructure__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * self, void * descriptor);
+
+void * _Nullable kotlinx_serialization_internal_TaggedEncoder_getTag__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(void * self, void * receiver, int32_t index);
+
+void * _Nullable kotlinx_serialization_internal_TaggedEncoder_popTag(void * self);
+
+void kotlinx_serialization_internal_TaggedEncoder_pushTag__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable name);
+
+void * kotlinx_serialization_internal_TaggedEncoder_serializersModule_get(void * self);
+
 NSSet<NSString *> * kotlinx_serialization_internal_jsonCachedSerialNames__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * receiver);
 
 void kotlinx_serialization_internal_throwArrayMissingFieldException__TypesOfArguments__ExportedKotlinPackages_kotlin_IntArray_ExportedKotlinPackages_kotlin_IntArray_anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(void * seenArray, void * goldenMaskArray, void * descriptor);
@@ -365,6 +767,10 @@
 
 void * kotlinx_serialization_modules_EmptySerializersModule_get();
 
+void kotlinx_serialization_modules_PolymorphicModuleBuilder_default__TypesOfArguments__U28Swift_Optional_Swift_String_U29202D_U20Swift_Optional_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy___(void * self, void * _Nullable (^defaultSerializerProvider)(NSString * _Nullable ));
+
+void kotlinx_serialization_modules_PolymorphicModuleBuilder_defaultDeserializer__TypesOfArguments__U28Swift_Optional_Swift_String_U29202D_U20Swift_Optional_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy___(void * self, void * _Nullable (^defaultDeserializerProvider)(NSString * _Nullable ));
+
 void kotlinx_serialization_modules_SerializersModuleBuilder_include__TypesOfArguments__ExportedKotlinPackages_kotlinx_serialization_modules_SerializersModule__(void * self, void * module);
 
 void kotlinx_serialization_modules_SerializersModule_dumpTo__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_modules_SerializersModuleCollector__(void * self, void * collector);
diff --git a/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinSerialization/KotlinSerialization.swift b/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinSerialization/KotlinSerialization.swift
index ebefa83..aa12ac9 100644
--- a/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinSerialization/KotlinSerialization.swift
+++ b/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinSerialization/KotlinSerialization.swift
@@ -12,13 +12,18 @@
 public typealias BinaryFormat = ExportedKotlinPackages.kotlinx.serialization.BinaryFormat
 typealias _BinaryFormat = ExportedKotlinPackages.kotlinx.serialization._BinaryFormat
 public typealias ContextualSerializer = ExportedKotlinPackages.kotlinx.serialization.ContextualSerializer
+public typealias DeserializationStrategy = ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy
+typealias _DeserializationStrategy = ExportedKotlinPackages.kotlinx.serialization._DeserializationStrategy
 public typealias KSerializer = ExportedKotlinPackages.kotlinx.serialization.KSerializer
+typealias _KSerializer = ExportedKotlinPackages.kotlinx.serialization._KSerializer
 public typealias MissingFieldException = ExportedKotlinPackages.kotlinx.serialization.MissingFieldException
 public typealias PolymorphicSerializer = ExportedKotlinPackages.kotlinx.serialization.PolymorphicSerializer
 public typealias SealedClassSerializer = ExportedKotlinPackages.kotlinx.serialization.SealedClassSerializer
 public typealias SerialFormat = ExportedKotlinPackages.kotlinx.serialization.SerialFormat
 typealias _SerialFormat = ExportedKotlinPackages.kotlinx.serialization._SerialFormat
 public typealias SerializationException = ExportedKotlinPackages.kotlinx.serialization.SerializationException
+public typealias SerializationStrategy = ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy
+typealias _SerializationStrategy = ExportedKotlinPackages.kotlinx.serialization._SerializationStrategy
 public typealias StringFormat = ExportedKotlinPackages.kotlinx.serialization.StringFormat
 typealias _StringFormat = ExportedKotlinPackages.kotlinx.serialization._StringFormat
 public final class _ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
@@ -96,14 +101,14 @@
 }
 public func decodeFromHexString(
     _ receiver: any ExportedKotlinPackages.kotlinx.serialization.BinaryFormat,
-    deserializer: Swift.Never,
+    deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
     hex: Swift.String
 ) -> KotlinRuntime.KotlinBase? {
     ExportedKotlinPackages.kotlinx.serialization.decodeFromHexString(receiver, deserializer: deserializer, hex: hex)
 }
 public func encodeToHexString(
     _ receiver: any ExportedKotlinPackages.kotlinx.serialization.BinaryFormat,
-    serializer: Swift.Never,
+    serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
     value: KotlinRuntime.KotlinBase?
 ) -> Swift.String {
     ExportedKotlinPackages.kotlinx.serialization.encodeToHexString(receiver, serializer: serializer, value: value)
@@ -112,31 +117,48 @@
     _ receiver: ExportedKotlinPackages.kotlinx.serialization.`internal`.AbstractPolymorphicSerializer,
     decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeDecoder,
     klassName: Swift.String?
-) -> Swift.Never {
+) -> any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy {
     ExportedKotlinPackages.kotlinx.serialization.findPolymorphicSerializer(receiver, decoder: decoder, klassName: klassName)
 }
 public func findPolymorphicSerializer(
     _ receiver: ExportedKotlinPackages.kotlinx.serialization.`internal`.AbstractPolymorphicSerializer,
     encoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder,
     value: KotlinRuntime.KotlinBase
-) -> Swift.Never {
+) -> any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy {
     ExportedKotlinPackages.kotlinx.serialization.findPolymorphicSerializer(receiver, encoder: encoder, value: value)
 }
 public extension ExportedKotlinPackages.kotlinx.serialization {
     public protocol BinaryFormat: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlinx.serialization.SerialFormat {
         func decodeFromByteArray(
-            deserializer: Swift.Never,
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
             bytes: ExportedKotlinPackages.kotlin.ByteArray
         ) -> KotlinRuntime.KotlinBase?
         func encodeToByteArray(
-            serializer: Swift.Never,
+            serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
             value: KotlinRuntime.KotlinBase?
         ) -> ExportedKotlinPackages.kotlin.ByteArray
     }
     @objc(_BinaryFormat)
     protocol _BinaryFormat: ExportedKotlinPackages.kotlinx.serialization._SerialFormat {
     }
-    public protocol KSerializer: KotlinRuntime.KotlinBase {
+    public protocol DeserializationStrategy: KotlinRuntime.KotlinBase {
+        var descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
+            get
+        }
+        func deserialize(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder
+        ) -> KotlinRuntime.KotlinBase?
+    }
+    @objc(_DeserializationStrategy)
+    protocol _DeserializationStrategy {
+    }
+    public protocol KSerializer: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy, ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy {
+        var descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
+            get
+        }
+    }
+    @objc(_KSerializer)
+    protocol _KSerializer: ExportedKotlinPackages.kotlinx.serialization._SerializationStrategy, ExportedKotlinPackages.kotlinx.serialization._DeserializationStrategy {
     }
     public protocol SerialFormat: KotlinRuntime.KotlinBase {
         var serializersModule: ExportedKotlinPackages.kotlinx.serialization.modules.SerializersModule {
@@ -146,13 +168,25 @@
     @objc(_SerialFormat)
     protocol _SerialFormat {
     }
+    public protocol SerializationStrategy: KotlinRuntime.KotlinBase {
+        var descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
+            get
+        }
+        func serialize(
+            encoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder,
+            value: KotlinRuntime.KotlinBase?
+        ) -> Swift.Void
+    }
+    @objc(_SerializationStrategy)
+    protocol _SerializationStrategy {
+    }
     public protocol StringFormat: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlinx.serialization.SerialFormat {
         func decodeFromString(
-            deserializer: Swift.Never,
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
             string: Swift.String
         ) -> KotlinRuntime.KotlinBase?
         func encodeToString(
-            serializer: Swift.Never,
+            serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
             value: KotlinRuntime.KotlinBase?
         ) -> Swift.String
     }
@@ -160,6 +194,40 @@
     protocol _StringFormat: ExportedKotlinPackages.kotlinx.serialization._SerialFormat {
     }
     public final class ContextualSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public var descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
+            get {
+                return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_ContextualSerializer_descriptor_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+            }
+        }
+        public func deserialize(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder
+        ) -> KotlinRuntime.KotlinBase {
+            return KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: kotlinx_serialization_ContextualSerializer_deserialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder__(self.__externalRCRef(), decoder.__externalRCRef()))
+        }
+        public func serialize(
+            encoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder,
+            value: KotlinRuntime.KotlinBase
+        ) -> Swift.Void {
+            return kotlinx_serialization_ContextualSerializer_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_KotlinRuntime_KotlinBase__(self.__externalRCRef(), encoder.__externalRCRef(), value.__externalRCRef())
+        }
+        public init(
+            serializableClass: Swift.Never
+        ) {
+            fatalError()
+        }
+        public init(
+            serializableClass: Swift.Never,
+            fallbackSerializer: (any ExportedKotlinPackages.kotlinx.serialization.KSerializer)?,
+            typeArgumentsSerializers: ExportedKotlinPackages.kotlin.Array
+        ) {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     public final class MissingFieldException: ExportedKotlinPackages.kotlinx.serialization.SerializationException {
         public var missingFields: [Swift.String] {
@@ -203,8 +271,68 @@
         }
     }
     public final class PolymorphicSerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.AbstractPolymorphicSerializer {
+        public override var baseClass: Swift.Never {
+            get {
+                fatalError()
+            }
+        }
+        public var descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
+            get {
+                return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_PolymorphicSerializer_descriptor_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+            }
+        }
+        public func toString() -> Swift.String {
+            return kotlinx_serialization_PolymorphicSerializer_toString(self.__externalRCRef())
+        }
+        public init(
+            baseClass: Swift.Never
+        ) {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     public final class SealedClassSerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.AbstractPolymorphicSerializer {
+        public override var baseClass: Swift.Never {
+            get {
+                fatalError()
+            }
+        }
+        public var descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
+            get {
+                return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_SealedClassSerializer_descriptor_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+            }
+        }
+        public func findPolymorphicSerializerOrNull(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeDecoder,
+            klassName: Swift.String?
+        ) -> (any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy)? {
+            return { switch kotlinx_serialization_SealedClassSerializer_findPolymorphicSerializerOrNull__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Optional_Swift_String___(self.__externalRCRef(), decoder.__externalRCRef(), klassName ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: res) as! any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy; } }()
+        }
+        public func findPolymorphicSerializerOrNull(
+            encoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder,
+            value: KotlinRuntime.KotlinBase
+        ) -> (any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy)? {
+            return { switch kotlinx_serialization_SealedClassSerializer_findPolymorphicSerializerOrNull__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_KotlinRuntime_KotlinBase__(self.__externalRCRef(), encoder.__externalRCRef(), value.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: res) as! any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy; } }()
+        }
+        public init(
+            serialName: Swift.String,
+            baseClass: Swift.Never,
+            subclasses: ExportedKotlinPackages.kotlin.Array,
+            subclassSerializers: ExportedKotlinPackages.kotlin.Array
+        ) {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     open class SerializationException: ExportedKotlinPackages.kotlin.IllegalArgumentException {
         public override init() {
@@ -294,71 +422,154 @@
     }
     public static func decodeFromHexString(
         _ receiver: any ExportedKotlinPackages.kotlinx.serialization.BinaryFormat,
-        deserializer: Swift.Never,
+        deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
         hex: Swift.String
     ) -> KotlinRuntime.KotlinBase? {
-        fatalError()
+        return { switch kotlinx_serialization_decodeFromHexString__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_BinaryFormat_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_String__(receiver.__externalRCRef(), deserializer.__externalRCRef(), hex) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
     }
     public static func encodeToHexString(
         _ receiver: any ExportedKotlinPackages.kotlinx.serialization.BinaryFormat,
-        serializer: Swift.Never,
+        serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
         value: KotlinRuntime.KotlinBase?
     ) -> Swift.String {
-        fatalError()
+        return kotlinx_serialization_encodeToHexString__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_BinaryFormat_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(receiver.__externalRCRef(), serializer.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
     }
     public static func findPolymorphicSerializer(
         _ receiver: ExportedKotlinPackages.kotlinx.serialization.`internal`.AbstractPolymorphicSerializer,
         decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeDecoder,
         klassName: Swift.String?
-    ) -> Swift.Never {
-        fatalError()
+    ) -> any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy {
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_findPolymorphicSerializer__TypesOfArguments__ExportedKotlinPackages_kotlinx_serialization_U60internalU60_AbstractPolymorphicSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Optional_Swift_String___(receiver.__externalRCRef(), decoder.__externalRCRef(), klassName ?? nil)) as! any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy
     }
     public static func findPolymorphicSerializer(
         _ receiver: ExportedKotlinPackages.kotlinx.serialization.`internal`.AbstractPolymorphicSerializer,
         encoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder,
         value: KotlinRuntime.KotlinBase
-    ) -> Swift.Never {
-        fatalError()
+    ) -> any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy {
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_findPolymorphicSerializer__TypesOfArguments__ExportedKotlinPackages_kotlinx_serialization_U60internalU60_AbstractPolymorphicSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_KotlinRuntime_KotlinBase__(receiver.__externalRCRef(), encoder.__externalRCRef(), value.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy
     }
 }
 public extension ExportedKotlinPackages.kotlinx.serialization.`internal` {
     public protocol GeneratedSerializer: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlinx.serialization.KSerializer {
+        func childSerializers() -> ExportedKotlinPackages.kotlin.Array
+        func typeParametersSerializers() -> ExportedKotlinPackages.kotlin.Array
+    }
+    @objc(_GeneratedSerializer)
+    protocol _GeneratedSerializer: ExportedKotlinPackages.kotlinx.serialization._KSerializer {
     }
     open class AbstractCollectionSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        open func builder() -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_AbstractCollectionSerializer_builder(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        open func deserialize(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder
+        ) -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_AbstractCollectionSerializer_deserialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder__(self.__externalRCRef(), decoder.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        public final func merge(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder,
+            previous: KotlinRuntime.KotlinBase?
+        ) -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_AbstractCollectionSerializer_merge__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), decoder.__externalRCRef(), previous.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        open func readAll(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeDecoder,
+            builder: KotlinRuntime.KotlinBase?,
+            startIndex: Swift.Int32,
+            size: Swift.Int32
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_AbstractCollectionSerializer_readAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int32_Swift_Int32__(self.__externalRCRef(), decoder.__externalRCRef(), builder.map { it in it.__externalRCRef() } ?? nil, startIndex, size)
+        }
+        open func readElement(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeDecoder,
+            index: Swift.Int32,
+            builder: KotlinRuntime.KotlinBase?,
+            checkIndex: Swift.Bool
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_AbstractCollectionSerializer_readElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Int32_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Bool__(self.__externalRCRef(), decoder.__externalRCRef(), index, builder.map { it in it.__externalRCRef() } ?? nil, checkIndex)
+        }
+        open func serialize(
+            encoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder,
+            value: KotlinRuntime.KotlinBase?
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_AbstractCollectionSerializer_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), encoder.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func builderSize(
+            _ receiver: KotlinRuntime.KotlinBase?
+        ) -> Swift.Int32 {
+            return kotlinx_serialization_internal_AbstractCollectionSerializer_builderSize__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), receiver.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func checkCapacity(
+            _ receiver: KotlinRuntime.KotlinBase?,
+            size: Swift.Int32
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_AbstractCollectionSerializer_checkCapacity__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int32__(self.__externalRCRef(), receiver.map { it in it.__externalRCRef() } ?? nil, size)
+        }
+        open func collectionIterator(
+            _ receiver: KotlinRuntime.KotlinBase?
+        ) -> any ExportedKotlinPackages.kotlin.collections.Iterator {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_AbstractCollectionSerializer_collectionIterator__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), receiver.map { it in it.__externalRCRef() } ?? nil)) as! any ExportedKotlinPackages.kotlin.collections.Iterator
+        }
+        open func collectionSize(
+            _ receiver: KotlinRuntime.KotlinBase?
+        ) -> Swift.Int32 {
+            return kotlinx_serialization_internal_AbstractCollectionSerializer_collectionSize__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), receiver.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func toBuilder(
+            _ receiver: KotlinRuntime.KotlinBase?
+        ) -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_AbstractCollectionSerializer_toBuilder__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), receiver.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        open func toResult(
+            _ receiver: KotlinRuntime.KotlinBase?
+        ) -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_AbstractCollectionSerializer_toResult__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), receiver.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        package init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     open class AbstractPolymorphicSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class ArrayListSerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.CollectionSerializer {
-    }
-    public final class BooleanArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class BooleanArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class BooleanSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class ByteArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class ByteArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class ByteSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class CharArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class CharArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class CharSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    open class CollectionLikeSerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.AbstractCollectionSerializer {
-    }
-    open class CollectionSerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.CollectionLikeSerializer {
-    }
-    public final class DoubleArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class DoubleArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class DoubleSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class DurationSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        open var baseClass: Swift.Never {
+            get {
+                fatalError()
+            }
+        }
+        public final func deserialize(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder
+        ) -> KotlinRuntime.KotlinBase {
+            return KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: kotlinx_serialization_internal_AbstractPolymorphicSerializer_deserialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder__(self.__externalRCRef(), decoder.__externalRCRef()))
+        }
+        open func findPolymorphicSerializerOrNull(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeDecoder,
+            klassName: Swift.String?
+        ) -> (any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy)? {
+            return { switch kotlinx_serialization_internal_AbstractPolymorphicSerializer_findPolymorphicSerializerOrNull__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Optional_Swift_String___(self.__externalRCRef(), decoder.__externalRCRef(), klassName ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: res) as! any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy; } }()
+        }
+        open func findPolymorphicSerializerOrNull(
+            encoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder,
+            value: KotlinRuntime.KotlinBase
+        ) -> (any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy)? {
+            return { switch kotlinx_serialization_internal_AbstractPolymorphicSerializer_findPolymorphicSerializerOrNull__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_KotlinRuntime_KotlinBase__(self.__externalRCRef(), encoder.__externalRCRef(), value.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: res) as! any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy; } }()
+        }
+        public final func serialize(
+            encoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder,
+            value: KotlinRuntime.KotlinBase
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_AbstractPolymorphicSerializer_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_KotlinRuntime_KotlinBase__(self.__externalRCRef(), encoder.__externalRCRef(), value.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     public final class ElementMarker: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
         public func mark(
@@ -388,97 +599,675 @@
             super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
         }
     }
-    public final class EnumSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class FloatArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class FloatArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class FloatSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class HashMapSerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.MapLikeSerializer {
-    }
-    public final class HashSetSerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.CollectionSerializer {
-    }
-    public final class IntArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class IntArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class IntSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    open class KeyValueSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class LinkedHashMapSerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.MapLikeSerializer {
-    }
-    public final class LinkedHashSetSerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.CollectionSerializer {
-    }
-    public final class LongArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class LongArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class LongSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class MapEntrySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.KeyValueSerializer {
-    }
     open class MapLikeSerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.AbstractCollectionSerializer {
+        open var descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
+            get {
+                return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_MapLikeSerializer_descriptor_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+            }
+        }
+        public final var keySerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
+            get {
+                return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_MapLikeSerializer_keySerializer_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
+            }
+        }
+        public final var valueSerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
+            get {
+                return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_MapLikeSerializer_valueSerializer_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
+            }
+        }
+        public final func readAll(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeDecoder,
+            builder: any ExportedKotlinPackages.kotlin.collections.MutableMap,
+            startIndex: Swift.Int32,
+            size: Swift.Int32
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_MapLikeSerializer_readAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_anyU20ExportedKotlinPackages_kotlin_collections_MutableMap_Swift_Int32_Swift_Int32__(self.__externalRCRef(), decoder.__externalRCRef(), builder.__externalRCRef(), startIndex, size)
+        }
+        public final func readElement(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeDecoder,
+            index: Swift.Int32,
+            builder: any ExportedKotlinPackages.kotlin.collections.MutableMap,
+            checkIndex: Swift.Bool
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_MapLikeSerializer_readElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_CompositeDecoder_Swift_Int32_anyU20ExportedKotlinPackages_kotlin_collections_MutableMap_Swift_Bool__(self.__externalRCRef(), decoder.__externalRCRef(), index, builder.__externalRCRef(), checkIndex)
+        }
+        open func serialize(
+            encoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder,
+            value: KotlinRuntime.KotlinBase?
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_MapLikeSerializer_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), encoder.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func insertKeyValuePair(
+            _ receiver: any ExportedKotlinPackages.kotlin.collections.MutableMap,
+            index: Swift.Int32,
+            key: KotlinRuntime.KotlinBase?,
+            value: KotlinRuntime.KotlinBase?
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_MapLikeSerializer_insertKeyValuePair__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_MutableMap_Swift_Int32_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), receiver.__externalRCRef(), index, key.map { it in it.__externalRCRef() } ?? nil, value.map { it in it.__externalRCRef() } ?? nil)
+        }
+        package init(
+            keySerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer,
+            valueSerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer
+        ) {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
-    open class NamedValueDecoder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    open class NamedValueDecoder: ExportedKotlinPackages.kotlinx.serialization.`internal`.TaggedDecoder {
+        open func composeName(
+            parentName: Swift.String,
+            childName: Swift.String
+        ) -> Swift.String {
+            return kotlinx_serialization_internal_NamedValueDecoder_composeName__TypesOfArguments__Swift_String_Swift_String__(self.__externalRCRef(), parentName, childName)
+        }
+        open func elementName(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.String {
+            return kotlinx_serialization_internal_NamedValueDecoder_elementName__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)
+        }
+        public final func nested(
+            nestedName: Swift.String
+        ) -> Swift.String {
+            return kotlinx_serialization_internal_NamedValueDecoder_nested__TypesOfArguments__Swift_String__(self.__externalRCRef(), nestedName)
+        }
+        public final func getTag(
+            _ receiver: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.String {
+            return kotlinx_serialization_internal_NamedValueDecoder_getTag__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), receiver.__externalRCRef(), index)
+        }
+        package override init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
-    open class NamedValueEncoder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    open class NamedValueEncoder: ExportedKotlinPackages.kotlinx.serialization.`internal`.TaggedEncoder {
+        open func composeName(
+            parentName: Swift.String,
+            childName: Swift.String
+        ) -> Swift.String {
+            return kotlinx_serialization_internal_NamedValueEncoder_composeName__TypesOfArguments__Swift_String_Swift_String__(self.__externalRCRef(), parentName, childName)
+        }
+        open func elementName(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.String {
+            return kotlinx_serialization_internal_NamedValueEncoder_elementName__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)
+        }
+        public final func nested(
+            nestedName: Swift.String
+        ) -> Swift.String {
+            return kotlinx_serialization_internal_NamedValueEncoder_nested__TypesOfArguments__Swift_String__(self.__externalRCRef(), nestedName)
+        }
+        public final func getTag(
+            _ receiver: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.String {
+            return kotlinx_serialization_internal_NamedValueEncoder_getTag__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), receiver.__externalRCRef(), index)
+        }
+        package override init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
-    public final class NothingSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    open class TaggedDecoder: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder, ExportedKotlinPackages.kotlinx.serialization.encoding._Decoder, ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeDecoder, ExportedKotlinPackages.kotlinx.serialization.encoding._CompositeDecoder, KotlinRuntimeSupport._KotlinBridged {
+        public final var currentTag: KotlinRuntime.KotlinBase? {
+            get {
+                return { switch kotlinx_serialization_internal_TaggedDecoder_currentTag_get(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+            }
+        }
+        public final var currentTagOrNull: KotlinRuntime.KotlinBase? {
+            get {
+                return { switch kotlinx_serialization_internal_TaggedDecoder_currentTagOrNull_get(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+            }
+        }
+        open var serializersModule: ExportedKotlinPackages.kotlinx.serialization.modules.SerializersModule {
+            get {
+                return ExportedKotlinPackages.kotlinx.serialization.modules.SerializersModule.__createClassWrapper(externalRCRef: kotlinx_serialization_internal_TaggedDecoder_serializersModule_get(self.__externalRCRef()))
+            }
+        }
+        open func beginStructure(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        ) -> any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeDecoder {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_TaggedDecoder_beginStructure__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(self.__externalRCRef(), descriptor.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeDecoder
+        }
+        public final func copyTagsTo(
+            other: ExportedKotlinPackages.kotlinx.serialization.`internal`.TaggedDecoder
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedDecoder_copyTagsTo__TypesOfArguments__ExportedKotlinPackages_kotlinx_serialization_U60internalU60_TaggedDecoder__(self.__externalRCRef(), other.__externalRCRef())
+        }
+        public final func decodeBoolean() -> Swift.Bool {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeBoolean(self.__externalRCRef())
+        }
+        public final func decodeBooleanElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.Bool {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeBooleanElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)
+        }
+        public final func decodeByte() -> Swift.Int8 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeByte(self.__externalRCRef())
+        }
+        public final func decodeByteElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.Int8 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeByteElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)
+        }
+        public final func decodeChar() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeChar(self.__externalRCRef())
+        }
+        public final func decodeCharElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeCharElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)
+        }
+        public final func decodeDouble() -> Swift.Double {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeDouble(self.__externalRCRef())
+        }
+        public final func decodeDoubleElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.Double {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeDoubleElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)
+        }
+        public final func decodeEnum(
+            enumDescriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        ) -> Swift.Int32 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeEnum__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(self.__externalRCRef(), enumDescriptor.__externalRCRef())
+        }
+        public final func decodeFloat() -> Swift.Float {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeFloat(self.__externalRCRef())
+        }
+        public final func decodeFloatElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.Float {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeFloatElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)
+        }
+        open func decodeInline(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        ) -> any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_TaggedDecoder_decodeInline__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(self.__externalRCRef(), descriptor.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder
+        }
+        public final func decodeInlineElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_TaggedDecoder_decodeInlineElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)) as! any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder
+        }
+        public final func decodeInt() -> Swift.Int32 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeInt(self.__externalRCRef())
+        }
+        public final func decodeIntElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeIntElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)
+        }
+        public final func decodeLong() -> Swift.Int64 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeLong(self.__externalRCRef())
+        }
+        public final func decodeLongElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.Int64 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeLongElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)
+        }
+        open func decodeNotNullMark() -> Swift.Bool {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeNotNullMark(self.__externalRCRef())
+        }
+        public final func decodeNull() -> Swift.Never? {
+            return { kotlinx_serialization_internal_TaggedDecoder_decodeNull(self.__externalRCRef()); return nil; }()
+        }
+        public final func decodeNullableSerializableElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
+            previousValue: KotlinRuntime.KotlinBase?
+        ) -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_TaggedDecoder_decodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, deserializer.__externalRCRef(), previousValue.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        public final func decodeSerializableElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
+            previousValue: KotlinRuntime.KotlinBase?
+        ) -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_TaggedDecoder_decodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, deserializer.__externalRCRef(), previousValue.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        open func decodeSerializableValue(
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
+            previousValue: KotlinRuntime.KotlinBase?
+        ) -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_TaggedDecoder_decodeSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), deserializer.__externalRCRef(), previousValue.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        public final func decodeShort() -> Swift.Int16 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeShort(self.__externalRCRef())
+        }
+        public final func decodeShortElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.Int16 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeShortElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)
+        }
+        public final func decodeString() -> Swift.String {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeString(self.__externalRCRef())
+        }
+        public final func decodeStringElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.String {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeStringElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)
+        }
+        open func decodeTaggedBoolean(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeTaggedBoolean__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func decodeTaggedByte(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Int8 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeTaggedByte__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func decodeTaggedChar(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeTaggedChar__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func decodeTaggedDouble(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Double {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeTaggedDouble__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func decodeTaggedEnum(
+            tag: KotlinRuntime.KotlinBase?,
+            enumDescriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        ) -> Swift.Int32 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeTaggedEnum__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, enumDescriptor.__externalRCRef())
+        }
+        open func decodeTaggedFloat(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Float {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeTaggedFloat__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func decodeTaggedInline(
+            tag: KotlinRuntime.KotlinBase?,
+            inlineDescriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        ) -> any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_TaggedDecoder_decodeTaggedInline__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, inlineDescriptor.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder
+        }
+        open func decodeTaggedInt(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Int32 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeTaggedInt__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func decodeTaggedLong(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Int64 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeTaggedLong__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func decodeTaggedNotNullMark(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeTaggedNotNullMark__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func decodeTaggedNull(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Never? {
+            return { kotlinx_serialization_internal_TaggedDecoder_decodeTaggedNull__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil); return nil; }()
+        }
+        open func decodeTaggedShort(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Int16 {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeTaggedShort__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func decodeTaggedString(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.String {
+            return kotlinx_serialization_internal_TaggedDecoder_decodeTaggedString__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func decodeTaggedValue(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> KotlinRuntime.KotlinBase {
+            return KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: kotlinx_serialization_internal_TaggedDecoder_decodeTaggedValue__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil))
+        }
+        open func endStructure(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedDecoder_endStructure__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(self.__externalRCRef(), descriptor.__externalRCRef())
+        }
+        public final func popTag() -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_TaggedDecoder_popTag(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        public final func pushTag(
+            name: KotlinRuntime.KotlinBase?
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedDecoder_pushTag__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), name.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func getTag(
+            _ receiver: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_TaggedDecoder_getTag__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), receiver.__externalRCRef(), index) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        package init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
-    public final class NullableSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class ObjectSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class PairSerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.KeyValueSerializer {
-    }
-    open class PrimitiveArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.CollectionLikeSerializer {
-    }
-    public final class ReferenceArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.CollectionLikeSerializer {
-    }
-    public final class ShortArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class ShortArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class ShortSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class StringSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class TripleSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class UByteArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class UByteArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class UByteSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class UIntArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class UIntArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class UIntSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class ULongArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class ULongArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class ULongSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class UShortArrayBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class UShortArraySerializer: ExportedKotlinPackages.kotlinx.serialization.`internal`.PrimitiveArraySerializer {
-    }
-    public final class UShortSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class UnitSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    open class TaggedEncoder: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder, ExportedKotlinPackages.kotlinx.serialization.encoding._Encoder, ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeEncoder, ExportedKotlinPackages.kotlinx.serialization.encoding._CompositeEncoder, KotlinRuntimeSupport._KotlinBridged {
+        public final var currentTag: KotlinRuntime.KotlinBase? {
+            get {
+                return { switch kotlinx_serialization_internal_TaggedEncoder_currentTag_get(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+            }
+        }
+        public final var currentTagOrNull: KotlinRuntime.KotlinBase? {
+            get {
+                return { switch kotlinx_serialization_internal_TaggedEncoder_currentTagOrNull_get(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+            }
+        }
+        open var serializersModule: ExportedKotlinPackages.kotlinx.serialization.modules.SerializersModule {
+            get {
+                return ExportedKotlinPackages.kotlinx.serialization.modules.SerializersModule.__createClassWrapper(externalRCRef: kotlinx_serialization_internal_TaggedEncoder_serializersModule_get(self.__externalRCRef()))
+            }
+        }
+        open func beginStructure(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        ) -> any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeEncoder {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_TaggedEncoder_beginStructure__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(self.__externalRCRef(), descriptor.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.encoding.CompositeEncoder
+        }
+        public final func encodeBoolean(
+            value: Swift.Bool
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeBoolean__TypesOfArguments__Swift_Bool__(self.__externalRCRef(), value)
+        }
+        public final func encodeBooleanElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            value: Swift.Bool
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeBooleanElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Bool__(self.__externalRCRef(), descriptor.__externalRCRef(), index, value)
+        }
+        public final func encodeByte(
+            value: Swift.Int8
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeByte__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), value)
+        }
+        public final func encodeByteElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            value: Swift.Int8
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeByteElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Int8__(self.__externalRCRef(), descriptor.__externalRCRef(), index, value)
+        }
+        public final func encodeChar(
+            value: Swift.Unicode.UTF16.CodeUnit
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeChar__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(self.__externalRCRef(), value)
+        }
+        public final func encodeCharElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            value: Swift.Unicode.UTF16.CodeUnit
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeCharElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Unicode_UTF16_CodeUnit__(self.__externalRCRef(), descriptor.__externalRCRef(), index, value)
+        }
+        public final func encodeDouble(
+            value: Swift.Double
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeDouble__TypesOfArguments__Swift_Double__(self.__externalRCRef(), value)
+        }
+        public final func encodeDoubleElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            value: Swift.Double
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeDoubleElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Double__(self.__externalRCRef(), descriptor.__externalRCRef(), index, value)
+        }
+        public final func encodeEnum(
+            enumDescriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeEnum__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), enumDescriptor.__externalRCRef(), index)
+        }
+        public final func encodeFloat(
+            value: Swift.Float
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeFloat__TypesOfArguments__Swift_Float__(self.__externalRCRef(), value)
+        }
+        public final func encodeFloatElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            value: Swift.Float
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeFloatElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Float__(self.__externalRCRef(), descriptor.__externalRCRef(), index, value)
+        }
+        open func encodeInline(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        ) -> any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_TaggedEncoder_encodeInline__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(self.__externalRCRef(), descriptor.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder
+        }
+        public final func encodeInlineElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_TaggedEncoder_encodeInlineElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index)) as! any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder
+        }
+        public final func encodeInt(
+            value: Swift.Int32
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeInt__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), value)
+        }
+        public final func encodeIntElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            value: Swift.Int32
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeIntElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Int32__(self.__externalRCRef(), descriptor.__externalRCRef(), index, value)
+        }
+        public final func encodeLong(
+            value: Swift.Int64
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeLong__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), value)
+        }
+        public final func encodeLongElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            value: Swift.Int64
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeLongElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Int64__(self.__externalRCRef(), descriptor.__externalRCRef(), index, value)
+        }
+        open func encodeNotNullMark() -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeNotNullMark(self.__externalRCRef())
+        }
+        open func encodeNull() -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeNull(self.__externalRCRef())
+        }
+        open func encodeNullableSerializableElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
+            value: KotlinRuntime.KotlinBase?
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, serializer.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func encodeSerializableElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
+            value: KotlinRuntime.KotlinBase?
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, serializer.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public final func encodeShort(
+            value: Swift.Int16
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeShort__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), value)
+        }
+        public final func encodeShortElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            value: Swift.Int16
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeShortElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_Int16__(self.__externalRCRef(), descriptor.__externalRCRef(), index, value)
+        }
+        public final func encodeString(
+            value: Swift.String
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeString__TypesOfArguments__Swift_String__(self.__externalRCRef(), value)
+        }
+        public final func encodeStringElement(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32,
+            value: Swift.String
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeStringElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_Swift_String__(self.__externalRCRef(), descriptor.__externalRCRef(), index, value)
+        }
+        open func encodeTaggedBoolean(
+            tag: KotlinRuntime.KotlinBase?,
+            value: Swift.Bool
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedBoolean__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Bool__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, value)
+        }
+        open func encodeTaggedByte(
+            tag: KotlinRuntime.KotlinBase?,
+            value: Swift.Int8
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedByte__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int8__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, value)
+        }
+        open func encodeTaggedChar(
+            tag: KotlinRuntime.KotlinBase?,
+            value: Swift.Unicode.UTF16.CodeUnit
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedChar__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Unicode_UTF16_CodeUnit__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, value)
+        }
+        open func encodeTaggedDouble(
+            tag: KotlinRuntime.KotlinBase?,
+            value: Swift.Double
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedDouble__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Double__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, value)
+        }
+        open func encodeTaggedEnum(
+            tag: KotlinRuntime.KotlinBase?,
+            enumDescriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            ordinal: Swift.Int32
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedEnum__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, enumDescriptor.__externalRCRef(), ordinal)
+        }
+        open func encodeTaggedFloat(
+            tag: KotlinRuntime.KotlinBase?,
+            value: Swift.Float
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedFloat__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Float__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, value)
+        }
+        open func encodeTaggedInline(
+            tag: KotlinRuntime.KotlinBase?,
+            inlineDescriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        ) -> any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_TaggedEncoder_encodeTaggedInline__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, inlineDescriptor.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder
+        }
+        open func encodeTaggedInt(
+            tag: KotlinRuntime.KotlinBase?,
+            value: Swift.Int32
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedInt__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int32__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, value)
+        }
+        open func encodeTaggedLong(
+            tag: KotlinRuntime.KotlinBase?,
+            value: Swift.Int64
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedLong__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int64__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, value)
+        }
+        open func encodeTaggedNonNullMark(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedNonNullMark__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func encodeTaggedNull(
+            tag: KotlinRuntime.KotlinBase?
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedNull__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func encodeTaggedShort(
+            tag: KotlinRuntime.KotlinBase?,
+            value: Swift.Int16
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedShort__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Int16__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, value)
+        }
+        open func encodeTaggedString(
+            tag: KotlinRuntime.KotlinBase?,
+            value: Swift.String
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedString__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_String__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, value)
+        }
+        open func encodeTaggedValue(
+            tag: KotlinRuntime.KotlinBase?,
+            value: KotlinRuntime.KotlinBase
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_encodeTaggedValue__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__KotlinRuntime_KotlinBase__(self.__externalRCRef(), tag.map { it in it.__externalRCRef() } ?? nil, value.__externalRCRef())
+        }
+        open func endEncode(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_endEncode__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(self.__externalRCRef(), descriptor.__externalRCRef())
+        }
+        public final func endStructure(
+            descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_endStructure__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(self.__externalRCRef(), descriptor.__externalRCRef())
+        }
+        public final func popTag() -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_TaggedEncoder_popTag(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        public final func pushTag(
+            name: KotlinRuntime.KotlinBase?
+        ) -> Swift.Void {
+            return kotlinx_serialization_internal_TaggedEncoder_pushTag__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), name.map { it in it.__externalRCRef() } ?? nil)
+        }
+        open func getTag(
+            _ receiver: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
+            index: Swift.Int32
+        ) -> KotlinRuntime.KotlinBase? {
+            return { switch kotlinx_serialization_internal_TaggedEncoder_getTag__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32__(self.__externalRCRef(), receiver.__externalRCRef(), index) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        package init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     public static func InlinePrimitiveDescriptor(
         name: Swift.String,
         primitiveSerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     ) -> any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_internal_InlinePrimitiveDescriptor__TypesOfArguments__Swift_String_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(name, primitiveSerializer.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
     }
     public static func throwArrayMissingFieldException(
         seenArray: ExportedKotlinPackages.kotlin.IntArray,
@@ -518,20 +1307,51 @@
         @available(*, deprecated, message: "Deprecated in favor of function with more precise name: polymorphicDefaultDeserializer. Replacement: polymorphicDefaultDeserializer(baseClass, defaultDeserializerProvider)")
         func polymorphicDefault(
             baseClass: Swift.Never,
-            defaultDeserializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Never
+            defaultDeserializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Optional<any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy>
         ) -> Swift.Void
         func polymorphicDefaultDeserializer(
             baseClass: Swift.Never,
-            defaultDeserializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Never
+            defaultDeserializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Optional<any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy>
         ) -> Swift.Void
         func polymorphicDefaultSerializer(
             baseClass: Swift.Never,
-            defaultSerializerProvider: @escaping (KotlinRuntime.KotlinBase) -> Swift.Never
+            defaultSerializerProvider: @escaping (KotlinRuntime.KotlinBase) -> Swift.Optional<any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy>
         ) -> Swift.Void
     }
     @objc(_SerializersModuleCollector)
     protocol _SerializersModuleCollector {
     }
+    public final class PolymorphicModuleBuilder: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        @available(*, deprecated, message: "Deprecated in favor of function with more precise name: defaultDeserializer. Replacement: defaultDeserializer(defaultSerializerProvider)")
+        public func `default`(
+            defaultSerializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Optional<any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy>
+        ) -> Swift.Void {
+            return kotlinx_serialization_modules_PolymorphicModuleBuilder_default__TypesOfArguments__U28Swift_Optional_Swift_String_U29202D_U20Swift_Optional_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy___(self.__externalRCRef(), {
+                let originalBlock = defaultSerializerProvider
+                return { arg0 in return originalBlock(arg0).map { it in it.__externalRCRef() } ?? nil }
+            }())
+        }
+        public func defaultDeserializer(
+            defaultDeserializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Optional<any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy>
+        ) -> Swift.Void {
+            return kotlinx_serialization_modules_PolymorphicModuleBuilder_defaultDeserializer__TypesOfArguments__U28Swift_Optional_Swift_String_U29202D_U20Swift_Optional_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy___(self.__externalRCRef(), {
+                let originalBlock = defaultDeserializerProvider
+                return { arg0 in return originalBlock(arg0).map { it in it.__externalRCRef() } ?? nil }
+            }())
+        }
+        public func subclass(
+            subclass: Swift.Never,
+            serializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer
+        ) -> Swift.Void {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+    }
     open class SerializersModule: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
         open func dumpTo(
             collector: any ExportedKotlinPackages.kotlinx.serialization.modules.SerializersModuleCollector
@@ -547,13 +1367,13 @@
         open func getPolymorphic(
             baseClass: Swift.Never,
             value: KotlinRuntime.KotlinBase
-        ) -> Swift.Never {
+        ) -> (any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy)? {
             fatalError()
         }
         open func getPolymorphic(
             baseClass: Swift.Never,
             serializedClassName: Swift.String?
-        ) -> Swift.Never {
+        ) -> (any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy)? {
             fatalError()
         }
         package init() {
@@ -593,13 +1413,13 @@
         }
         public func polymorphicDefaultDeserializer(
             baseClass: Swift.Never,
-            defaultDeserializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Never
+            defaultDeserializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Optional<any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy>
         ) -> Swift.Void {
             fatalError()
         }
         public func polymorphicDefaultSerializer(
             baseClass: Swift.Never,
-            defaultSerializerProvider: @escaping (KotlinRuntime.KotlinBase) -> Swift.Never
+            defaultSerializerProvider: @escaping (KotlinRuntime.KotlinBase) -> Swift.Optional<any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy>
         ) -> Swift.Void {
             fatalError()
         }
@@ -1044,13 +1864,13 @@
     }
     public static func getElementDescriptors(
         _ receiver: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
-    ) -> Swift.Never {
-        fatalError()
+    ) -> any ExportedKotlinPackages.kotlin.collections.Iterable {
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_descriptors_elementDescriptors_get__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.Iterable
     }
     public static func getElementNames(
         _ receiver: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
-    ) -> Swift.Never {
-        fatalError()
+    ) -> any ExportedKotlinPackages.kotlin.collections.Iterable {
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_descriptors_elementNames_get__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.Iterable
     }
     public static func getNullable(
         _ receiver: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
@@ -1126,11 +1946,41 @@
 }
 public extension ExportedKotlinPackages.kotlinx.serialization.builtins {
     public final class LongAsStringSerializer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public var descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
+            get {
+                return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_LongAsStringSerializer_descriptor_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+            }
+        }
+        public static var shared: ExportedKotlinPackages.kotlinx.serialization.builtins.LongAsStringSerializer {
+            get {
+                return ExportedKotlinPackages.kotlinx.serialization.builtins.LongAsStringSerializer.__createClassWrapper(externalRCRef: kotlinx_serialization_builtins_LongAsStringSerializer_get())
+            }
+        }
+        public func deserialize(
+            decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder
+        ) -> Swift.Int64 {
+            return kotlinx_serialization_builtins_LongAsStringSerializer_deserialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder__(self.__externalRCRef(), decoder.__externalRCRef())
+        }
+        public func serialize(
+            encoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder,
+            value: Swift.Int64
+        ) -> Swift.Void {
+            return kotlinx_serialization_builtins_LongAsStringSerializer_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_Swift_Int64__(self.__externalRCRef(), encoder.__externalRCRef(), value)
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+        private init() {
+            fatalError()
+        }
     }
     public static func getNullable(
         _ receiver: any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_nullable_get__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func ArraySerializer(
         kClass: Swift.Never,
@@ -1139,151 +1989,151 @@
         fatalError()
     }
     public static func BooleanArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_BooleanArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func ByteArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_ByteArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func CharArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_CharArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func DoubleArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_DoubleArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func FloatArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_FloatArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func IntArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_IntArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func ListSerializer(
         elementSerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_ListSerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(elementSerializer.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func LongArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_LongArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func MapEntrySerializer(
         keySerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer,
         valueSerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_MapEntrySerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(keySerializer.__externalRCRef(), valueSerializer.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func MapSerializer(
         keySerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer,
         valueSerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_MapSerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(keySerializer.__externalRCRef(), valueSerializer.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func NothingSerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_NothingSerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func PairSerializer(
         keySerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer,
         valueSerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_PairSerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(keySerializer.__externalRCRef(), valueSerializer.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func SetSerializer(
         elementSerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_SetSerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(elementSerializer.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func ShortArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_ShortArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func TripleSerializer(
         aSerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer,
         bSerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer,
         cSerializer: any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_TripleSerializer__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer_anyU20ExportedKotlinPackages_kotlinx_serialization_KSerializer__(aSerializer.__externalRCRef(), bSerializer.__externalRCRef(), cSerializer.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func UByteArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_UByteArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func UIntArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_UIntArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func ULongArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_ULongArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func UShortArraySerializer() -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_UShortArraySerializer()) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func serializer(
         _ receiver: ExportedKotlinPackages.kotlin.Boolean.Companion
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Boolean_Companion__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func serializer(
         _ receiver: ExportedKotlinPackages.kotlin.Byte.Companion
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Byte_Companion__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func serializer(
         _ receiver: ExportedKotlinPackages.kotlin.Char.Companion
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Char_Companion__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func serializer(
         _ receiver: ExportedKotlinPackages.kotlin.Double.Companion
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Double_Companion__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func serializer(
         _ receiver: ExportedKotlinPackages.kotlin.Float.Companion
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Float_Companion__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func serializer(
         _ receiver: ExportedKotlinPackages.kotlin.Int.Companion
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Int_Companion__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func serializer(
         _ receiver: ExportedKotlinPackages.kotlin.Long.Companion
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Long_Companion__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func serializer(
         _ receiver: ExportedKotlinPackages.kotlin.Short.Companion
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_Short_Companion__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func serializer(
         _ receiver: ExportedKotlinPackages.kotlin.String.Companion
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_serializer__TypesOfArguments__ExportedKotlinPackages_kotlin_String_Companion__(receiver.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func serializer(
-        _ receiver: ExportedKotlinPackages.kotlin.UByte.Companion
+        _ receiver: Swift.Never
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
         fatalError()
     }
     public static func serializer(
-        _ receiver: ExportedKotlinPackages.kotlin.UInt.Companion
+        _ receiver: Swift.Never
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
         fatalError()
     }
     public static func serializer(
-        _ receiver: ExportedKotlinPackages.kotlin.ULong.Companion
+        _ receiver: Swift.Never
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
         fatalError()
     }
     public static func serializer(
-        _ receiver: ExportedKotlinPackages.kotlin.UShort.Companion
+        _ receiver: Swift.Never
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
         fatalError()
     }
     public static func serializer(
         _ receiver: Swift.Void
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
-        fatalError()
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_builtins_serializer__TypesOfArguments__Swift_Void__(receiver)) as! any ExportedKotlinPackages.kotlinx.serialization.KSerializer
     }
     public static func serializer(
-        _ receiver: ExportedKotlinPackages.kotlin.time.Duration.Companion
+        _ receiver: Swift.Never
     ) -> any ExportedKotlinPackages.kotlinx.serialization.KSerializer {
         fatalError()
     }
@@ -1343,14 +2193,14 @@
         func decodeNullableSerializableElement(
             descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
             index: Swift.Int32,
-            deserializer: Swift.Never,
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
             previousValue: KotlinRuntime.KotlinBase?
         ) -> KotlinRuntime.KotlinBase?
         func decodeSequentially() -> Swift.Bool
         func decodeSerializableElement(
             descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
             index: Swift.Int32,
-            deserializer: Swift.Never,
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
             previousValue: KotlinRuntime.KotlinBase?
         ) -> KotlinRuntime.KotlinBase?
         func decodeShortElement(
@@ -1414,13 +2264,13 @@
         func encodeNullableSerializableElement(
             descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
             index: Swift.Int32,
-            serializer: Swift.Never,
+            serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
             value: KotlinRuntime.KotlinBase?
         ) -> Swift.Void
         func encodeSerializableElement(
             descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
             index: Swift.Int32,
-            serializer: Swift.Never,
+            serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
             value: KotlinRuntime.KotlinBase?
         ) -> Swift.Void
         func encodeShortElement(
@@ -1467,10 +2317,10 @@
         func decodeNotNullMark() -> Swift.Bool
         func decodeNull() -> Swift.Never?
         func decodeNullableSerializableValue(
-            deserializer: Swift.Never
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy
         ) -> KotlinRuntime.KotlinBase?
         func decodeSerializableValue(
-            deserializer: Swift.Never
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy
         ) -> KotlinRuntime.KotlinBase?
         func decodeShort() -> Swift.Int16
         func decodeString() -> Swift.String
@@ -1520,11 +2370,11 @@
         func encodeNotNullMark() -> Swift.Void
         func encodeNull() -> Swift.Void
         func encodeNullableSerializableValue(
-            serializer: Swift.Never,
+            serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
             value: KotlinRuntime.KotlinBase?
         ) -> Swift.Void
         func encodeSerializableValue(
-            serializer: Swift.Never,
+            serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
             value: KotlinRuntime.KotlinBase?
         ) -> Swift.Void
         func encodeShort(
@@ -1631,24 +2481,24 @@
         public final func decodeNullableSerializableElement(
             descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
             index: Swift.Int32,
-            deserializer: Swift.Never,
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
             previousValue: KotlinRuntime.KotlinBase?
         ) -> KotlinRuntime.KotlinBase? {
-            fatalError()
+            return { switch kotlinx_serialization_encoding_AbstractDecoder_decodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, deserializer.__externalRCRef(), previousValue.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
         }
         open func decodeSerializableElement(
             descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
             index: Swift.Int32,
-            deserializer: Swift.Never,
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
             previousValue: KotlinRuntime.KotlinBase?
         ) -> KotlinRuntime.KotlinBase? {
-            fatalError()
+            return { switch kotlinx_serialization_encoding_AbstractDecoder_decodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, deserializer.__externalRCRef(), previousValue.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
         }
         open func decodeSerializableValue(
-            deserializer: Swift.Never,
+            deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
             previousValue: KotlinRuntime.KotlinBase?
         ) -> KotlinRuntime.KotlinBase? {
-            fatalError()
+            return { switch kotlinx_serialization_encoding_AbstractDecoder_decodeSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), deserializer.__externalRCRef(), previousValue.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
         }
         open func decodeShort() -> Swift.Int16 {
             return kotlinx_serialization_encoding_AbstractDecoder_decodeShort(self.__externalRCRef())
@@ -1805,18 +2655,18 @@
         open func encodeNullableSerializableElement(
             descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
             index: Swift.Int32,
-            serializer: Swift.Never,
+            serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
             value: KotlinRuntime.KotlinBase?
         ) -> Swift.Void {
-            fatalError()
+            return kotlinx_serialization_encoding_AbstractEncoder_encodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, serializer.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
         }
         open func encodeSerializableElement(
             descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
             index: Swift.Int32,
-            serializer: Swift.Never,
+            serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
             value: KotlinRuntime.KotlinBase?
         ) -> Swift.Void {
-            fatalError()
+            return kotlinx_serialization_encoding_AbstractEncoder_encodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, serializer.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
         }
         open func encodeShort(
             value: Swift.Int16
@@ -1865,20 +2715,43 @@
 }
 public extension ExportedKotlinPackages.kotlinx.serialization.BinaryFormat where Self : KotlinRuntimeSupport._KotlinBridged {
     public func decodeFromByteArray(
-        deserializer: Swift.Never,
+        deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
         bytes: ExportedKotlinPackages.kotlin.ByteArray
     ) -> KotlinRuntime.KotlinBase? {
-        fatalError()
+        return { switch kotlinx_serialization_BinaryFormat_decodeFromByteArray__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_ExportedKotlinPackages_kotlin_ByteArray__(self.__externalRCRef(), deserializer.__externalRCRef(), bytes.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
     }
     public func encodeToByteArray(
-        serializer: Swift.Never,
+        serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
         value: KotlinRuntime.KotlinBase?
     ) -> ExportedKotlinPackages.kotlin.ByteArray {
-        fatalError()
+        return ExportedKotlinPackages.kotlin.ByteArray.__createClassWrapper(externalRCRef: kotlinx_serialization_BinaryFormat_encodeToByteArray__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), serializer.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil))
     }
 }
 extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlinx.serialization.BinaryFormat where Wrapped : ExportedKotlinPackages.kotlinx.serialization._BinaryFormat {
 }
+public extension ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy where Self : KotlinRuntimeSupport._KotlinBridged {
+    public var descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
+        get {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_DeserializationStrategy_descriptor_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        }
+    }
+    public func deserialize(
+        decoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Decoder
+    ) -> KotlinRuntime.KotlinBase? {
+        return { switch kotlinx_serialization_DeserializationStrategy_deserialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Decoder__(self.__externalRCRef(), decoder.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy where Wrapped : ExportedKotlinPackages.kotlinx.serialization._DeserializationStrategy {
+}
+public extension ExportedKotlinPackages.kotlinx.serialization.KSerializer where Self : KotlinRuntimeSupport._KotlinBridged {
+    public var descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
+        get {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_KSerializer_descriptor_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        }
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlinx.serialization.KSerializer where Wrapped : ExportedKotlinPackages.kotlinx.serialization._KSerializer {
+}
 public extension ExportedKotlinPackages.kotlinx.serialization.SerialFormat where Self : KotlinRuntimeSupport._KotlinBridged {
     public var serializersModule: ExportedKotlinPackages.kotlinx.serialization.modules.SerializersModule {
         get {
@@ -1888,22 +2761,47 @@
 }
 extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlinx.serialization.SerialFormat where Wrapped : ExportedKotlinPackages.kotlinx.serialization._SerialFormat {
 }
+public extension ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy where Self : KotlinRuntimeSupport._KotlinBridged {
+    public var descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor {
+        get {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlinx_serialization_SerializationStrategy_descriptor_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor
+        }
+    }
+    public func serialize(
+        encoder: any ExportedKotlinPackages.kotlinx.serialization.encoding.Encoder,
+        value: KotlinRuntime.KotlinBase?
+    ) -> Swift.Void {
+        return kotlinx_serialization_SerializationStrategy_serialize__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_encoding_Encoder_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), encoder.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy where Wrapped : ExportedKotlinPackages.kotlinx.serialization._SerializationStrategy {
+}
 public extension ExportedKotlinPackages.kotlinx.serialization.StringFormat where Self : KotlinRuntimeSupport._KotlinBridged {
     public func decodeFromString(
-        deserializer: Swift.Never,
+        deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
         string: Swift.String
     ) -> KotlinRuntime.KotlinBase? {
-        fatalError()
+        return { switch kotlinx_serialization_StringFormat_decodeFromString__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_String__(self.__externalRCRef(), deserializer.__externalRCRef(), string) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
     }
     public func encodeToString(
-        serializer: Swift.Never,
+        serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
         value: KotlinRuntime.KotlinBase?
     ) -> Swift.String {
-        fatalError()
+        return kotlinx_serialization_StringFormat_encodeToString__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), serializer.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
     }
 }
 extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlinx.serialization.StringFormat where Wrapped : ExportedKotlinPackages.kotlinx.serialization._StringFormat {
 }
+public extension ExportedKotlinPackages.kotlinx.serialization.`internal`.GeneratedSerializer where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func childSerializers() -> ExportedKotlinPackages.kotlin.Array {
+        return ExportedKotlinPackages.kotlin.Array.__createClassWrapper(externalRCRef: kotlinx_serialization_internal_GeneratedSerializer_childSerializers(self.__externalRCRef()))
+    }
+    public func typeParametersSerializers() -> ExportedKotlinPackages.kotlin.Array {
+        return ExportedKotlinPackages.kotlin.Array.__createClassWrapper(externalRCRef: kotlinx_serialization_internal_GeneratedSerializer_typeParametersSerializers(self.__externalRCRef()))
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlinx.serialization.`internal`.GeneratedSerializer where Wrapped : ExportedKotlinPackages.kotlinx.serialization.`internal`._GeneratedSerializer {
+}
 public extension ExportedKotlinPackages.kotlinx.serialization.modules.SerializersModuleCollector where Self : KotlinRuntimeSupport._KotlinBridged {
     public func contextual(
         kClass: Swift.Never,
@@ -1927,19 +2825,19 @@
     @available(*, deprecated, message: "Deprecated in favor of function with more precise name: polymorphicDefaultDeserializer. Replacement: polymorphicDefaultDeserializer(baseClass, defaultDeserializerProvider)")
     public func polymorphicDefault(
         baseClass: Swift.Never,
-        defaultDeserializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Never
+        defaultDeserializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Optional<any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy>
     ) -> Swift.Void {
         fatalError()
     }
     public func polymorphicDefaultDeserializer(
         baseClass: Swift.Never,
-        defaultDeserializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Never
+        defaultDeserializerProvider: @escaping (Swift.Optional<Swift.String>) -> Swift.Optional<any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy>
     ) -> Swift.Void {
         fatalError()
     }
     public func polymorphicDefaultSerializer(
         baseClass: Swift.Never,
-        defaultSerializerProvider: @escaping (KotlinRuntime.KotlinBase) -> Swift.Never
+        defaultSerializerProvider: @escaping (KotlinRuntime.KotlinBase) -> Swift.Optional<any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy>
     ) -> Swift.Void {
         fatalError()
     }
@@ -2084,10 +2982,10 @@
     public func decodeNullableSerializableElement(
         descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
         index: Swift.Int32,
-        deserializer: Swift.Never,
+        deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
         previousValue: KotlinRuntime.KotlinBase?
     ) -> KotlinRuntime.KotlinBase? {
-        fatalError()
+        return { switch kotlinx_serialization_encoding_CompositeDecoder_decodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, deserializer.__externalRCRef(), previousValue.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
     }
     public func decodeSequentially() -> Swift.Bool {
         return kotlinx_serialization_encoding_CompositeDecoder_decodeSequentially(self.__externalRCRef())
@@ -2095,10 +2993,10 @@
     public func decodeSerializableElement(
         descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
         index: Swift.Int32,
-        deserializer: Swift.Never,
+        deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy,
         previousValue: KotlinRuntime.KotlinBase?
     ) -> KotlinRuntime.KotlinBase? {
-        fatalError()
+        return { switch kotlinx_serialization_encoding_CompositeDecoder_decodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, deserializer.__externalRCRef(), previousValue.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
     }
     public func decodeShortElement(
         descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
@@ -2184,18 +3082,18 @@
     public func encodeNullableSerializableElement(
         descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
         index: Swift.Int32,
-        serializer: Swift.Never,
+        serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
         value: KotlinRuntime.KotlinBase?
     ) -> Swift.Void {
-        fatalError()
+        return kotlinx_serialization_encoding_CompositeEncoder_encodeNullableSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, serializer.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
     }
     public func encodeSerializableElement(
         descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
         index: Swift.Int32,
-        serializer: Swift.Never,
+        serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
         value: KotlinRuntime.KotlinBase?
     ) -> Swift.Void {
-        fatalError()
+        return kotlinx_serialization_encoding_CompositeEncoder_encodeSerializableElement__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_descriptors_SerialDescriptor_Swift_Int32_anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), descriptor.__externalRCRef(), index, serializer.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
     }
     public func encodeShortElement(
         descriptor: any ExportedKotlinPackages.kotlinx.serialization.descriptors.SerialDescriptor,
@@ -2274,14 +3172,14 @@
         return { kotlinx_serialization_encoding_Decoder_decodeNull(self.__externalRCRef()); return nil; }()
     }
     public func decodeNullableSerializableValue(
-        deserializer: Swift.Never
+        deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy
     ) -> KotlinRuntime.KotlinBase? {
-        fatalError()
+        return { switch kotlinx_serialization_encoding_Decoder_decodeNullableSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy__(self.__externalRCRef(), deserializer.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
     }
     public func decodeSerializableValue(
-        deserializer: Swift.Never
+        deserializer: any ExportedKotlinPackages.kotlinx.serialization.DeserializationStrategy
     ) -> KotlinRuntime.KotlinBase? {
-        fatalError()
+        return { switch kotlinx_serialization_encoding_Decoder_decodeSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_DeserializationStrategy__(self.__externalRCRef(), deserializer.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
     }
     public func decodeShort() -> Swift.Int16 {
         return kotlinx_serialization_encoding_Decoder_decodeShort(self.__externalRCRef())
@@ -2362,16 +3260,16 @@
         return kotlinx_serialization_encoding_Encoder_encodeNull(self.__externalRCRef())
     }
     public func encodeNullableSerializableValue(
-        serializer: Swift.Never,
+        serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
         value: KotlinRuntime.KotlinBase?
     ) -> Swift.Void {
-        fatalError()
+        return kotlinx_serialization_encoding_Encoder_encodeNullableSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), serializer.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
     }
     public func encodeSerializableValue(
-        serializer: Swift.Never,
+        serializer: any ExportedKotlinPackages.kotlinx.serialization.SerializationStrategy,
         value: KotlinRuntime.KotlinBase?
     ) -> Swift.Void {
-        fatalError()
+        return kotlinx_serialization_encoding_Encoder_encodeSerializableValue__TypesOfArguments__anyU20ExportedKotlinPackages_kotlinx_serialization_SerializationStrategy_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), serializer.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
     }
     public func encodeShort(
         value: Swift.Int16
diff --git a/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinStdlib/KotlinStdlib.h b/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinStdlib/KotlinStdlib.h
index 501721b..b0490d0 100644
--- a/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinStdlib/KotlinStdlib.h
+++ b/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinStdlib/KotlinStdlib.h
@@ -3,18 +3,220 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
+void * _Nullable kotlin_Array_get__TypesOfArguments__Swift_Int32__(void * self, int32_t index);
+
+void * kotlin_Array_iterator(void * self);
+
+void kotlin_Array_set__TypesOfArguments__Swift_Int32_Swift_Optional_KotlinRuntime_KotlinBase___(void * self, int32_t index, void * _Nullable value);
+
+int32_t kotlin_Array_size_get(void * self);
+
+void * kotlin_Boolean_Companion_get();
+
+_Bool kotlin_Boolean_and__TypesOfArguments__Swift_Bool__(void * self, _Bool other);
+
+int32_t kotlin_Boolean_compareTo__TypesOfArguments__Swift_Bool__(void * self, _Bool other);
+
+_Bool kotlin_Boolean_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_Boolean_hashCode(void * self);
+
+_Bool kotlin_Boolean_not(void * self);
+
+_Bool kotlin_Boolean_or__TypesOfArguments__Swift_Bool__(void * self, _Bool other);
+
+NSString * kotlin_Boolean_toString(void * self);
+
+_Bool kotlin_Boolean_xor__TypesOfArguments__Swift_Bool__(void * self, _Bool other);
+
 int8_t kotlin_ByteArray_get__TypesOfArguments__Swift_Int32__(void * self, int32_t index);
 
+void * kotlin_ByteArray_iterator(void * self);
+
 void kotlin_ByteArray_set__TypesOfArguments__Swift_Int32_Swift_Int8__(void * self, int32_t index, int8_t value);
 
 int32_t kotlin_ByteArray_size_get(void * self);
 
+int8_t kotlin_Byte_Companion_MAX_VALUE_get(void * self);
+
+int8_t kotlin_Byte_Companion_MIN_VALUE_get(void * self);
+
+int32_t kotlin_Byte_Companion_SIZE_BITS_get(void * self);
+
+int32_t kotlin_Byte_Companion_SIZE_BYTES_get(void * self);
+
+void * kotlin_Byte_Companion_get();
+
+int32_t kotlin_Byte_compareTo__TypesOfArguments__Swift_Int8__(void * self, int8_t other);
+
+int8_t kotlin_Byte_dec(void * self);
+
+_Bool kotlin_Byte_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_Byte_hashCode(void * self);
+
+int8_t kotlin_Byte_inc(void * self);
+
+void * kotlin_Byte_rangeTo__TypesOfArguments__Swift_Int8__(void * self, int8_t other);
+
+void * kotlin_Byte_rangeTo__TypesOfArguments__Swift_Int16__(void * self, int16_t other);
+
+void * kotlin_Byte_rangeTo__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+void * kotlin_Byte_rangeTo__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+void * kotlin_Byte_rangeUntil__TypesOfArguments__Swift_Int8__(void * self, int8_t other);
+
+void * kotlin_Byte_rangeUntil__TypesOfArguments__Swift_Int16__(void * self, int16_t other);
+
+void * kotlin_Byte_rangeUntil__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+void * kotlin_Byte_rangeUntil__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+uint16_t kotlin_Byte_toChar(void * self);
+
+double kotlin_Byte_toDouble(void * self);
+
+float kotlin_Byte_toFloat(void * self);
+
+int32_t kotlin_Byte_toInt(void * self);
+
+int64_t kotlin_Byte_toLong(void * self);
+
+int16_t kotlin_Byte_toShort(void * self);
+
+NSString * kotlin_Byte_toString(void * self);
+
 uint16_t kotlin_CharSequence_get__TypesOfArguments__Swift_Int32__(void * self, int32_t index);
 
 int32_t kotlin_CharSequence_length_get(void * self);
 
 void * kotlin_CharSequence_subSequence__TypesOfArguments__Swift_Int32_Swift_Int32__(void * self, int32_t startIndex, int32_t endIndex);
 
+int32_t kotlin_Char_Companion_MAX_CODE_POINT_get(void * self);
+
+uint16_t kotlin_Char_Companion_MAX_HIGH_SURROGATE_get(void * self);
+
+uint16_t kotlin_Char_Companion_MAX_LOW_SURROGATE_get(void * self);
+
+int32_t kotlin_Char_Companion_MAX_RADIX_get(void * self);
+
+uint16_t kotlin_Char_Companion_MAX_SURROGATE_get(void * self);
+
+uint16_t kotlin_Char_Companion_MAX_VALUE_get(void * self);
+
+int32_t kotlin_Char_Companion_MIN_CODE_POINT_get(void * self);
+
+uint16_t kotlin_Char_Companion_MIN_HIGH_SURROGATE_get(void * self);
+
+uint16_t kotlin_Char_Companion_MIN_LOW_SURROGATE_get(void * self);
+
+int32_t kotlin_Char_Companion_MIN_RADIX_get(void * self);
+
+int32_t kotlin_Char_Companion_MIN_SUPPLEMENTARY_CODE_POINT_get(void * self);
+
+uint16_t kotlin_Char_Companion_MIN_SURROGATE_get(void * self);
+
+uint16_t kotlin_Char_Companion_MIN_VALUE_get(void * self);
+
+int32_t kotlin_Char_Companion_SIZE_BITS_get(void * self);
+
+int32_t kotlin_Char_Companion_SIZE_BYTES_get(void * self);
+
+void * kotlin_Char_Companion_get();
+
+int32_t kotlin_Char_compareTo__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(void * self, uint16_t other);
+
+uint16_t kotlin_Char_dec(void * self);
+
+_Bool kotlin_Char_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_Char_hashCode(void * self);
+
+uint16_t kotlin_Char_inc(void * self);
+
+void * kotlin_Char_rangeTo__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(void * self, uint16_t other);
+
+void * kotlin_Char_rangeUntil__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(void * self, uint16_t other);
+
+int8_t kotlin_Char_toByte(void * self);
+
+double kotlin_Char_toDouble(void * self);
+
+float kotlin_Char_toFloat(void * self);
+
+int32_t kotlin_Char_toInt(void * self);
+
+int64_t kotlin_Char_toLong(void * self);
+
+int16_t kotlin_Char_toShort(void * self);
+
+NSString * kotlin_Char_toString(void * self);
+
+double kotlin_Double_Companion_MAX_VALUE_get(void * self);
+
+double kotlin_Double_Companion_MIN_VALUE_get(void * self);
+
+double kotlin_Double_Companion_NEGATIVE_INFINITY_get(void * self);
+
+double kotlin_Double_Companion_NaN_get(void * self);
+
+double kotlin_Double_Companion_POSITIVE_INFINITY_get(void * self);
+
+int32_t kotlin_Double_Companion_SIZE_BITS_get(void * self);
+
+int32_t kotlin_Double_Companion_SIZE_BYTES_get(void * self);
+
+void * kotlin_Double_Companion_get();
+
+int32_t kotlin_Double_compareTo__TypesOfArguments__Swift_Int8__(void * self, int8_t other);
+
+int32_t kotlin_Double_compareTo__TypesOfArguments__Swift_Int16__(void * self, int16_t other);
+
+int32_t kotlin_Double_compareTo__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+int32_t kotlin_Double_compareTo__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+int32_t kotlin_Double_compareTo__TypesOfArguments__Swift_Float__(void * self, float other);
+
+int32_t kotlin_Double_compareTo__TypesOfArguments__Swift_Double__(void * self, double other);
+
+double kotlin_Double_dec(void * self);
+
+double kotlin_Double_div__TypesOfArguments__Swift_Double__(void * self, double other);
+
+_Bool kotlin_Double_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_Double_hashCode(void * self);
+
+double kotlin_Double_inc(void * self);
+
+double kotlin_Double_minus__TypesOfArguments__Swift_Double__(void * self, double other);
+
+double kotlin_Double_plus__TypesOfArguments__Swift_Double__(void * self, double other);
+
+double kotlin_Double_rem__TypesOfArguments__Swift_Double__(void * self, double other);
+
+double kotlin_Double_times__TypesOfArguments__Swift_Double__(void * self, double other);
+
+int8_t kotlin_Double_toByte(void * self);
+
+uint16_t kotlin_Double_toChar(void * self);
+
+float kotlin_Double_toFloat(void * self);
+
+int32_t kotlin_Double_toInt(void * self);
+
+int64_t kotlin_Double_toLong(void * self);
+
+int16_t kotlin_Double_toShort(void * self);
+
+NSString * kotlin_Double_toString(void * self);
+
+double kotlin_Double_unaryMinus(void * self);
+
+double kotlin_Double_unaryPlus(void * self);
+
 void * kotlin_Exception_init_allocate();
 
 void kotlin_Exception_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
@@ -25,6 +227,70 @@
 
 void kotlin_Exception_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_ExportedKotlinPackages_kotlin_Throwable___(void * __kt, void * _Nullable cause);
 
+float kotlin_Float_Companion_MAX_VALUE_get(void * self);
+
+float kotlin_Float_Companion_MIN_VALUE_get(void * self);
+
+float kotlin_Float_Companion_NEGATIVE_INFINITY_get(void * self);
+
+float kotlin_Float_Companion_NaN_get(void * self);
+
+float kotlin_Float_Companion_POSITIVE_INFINITY_get(void * self);
+
+int32_t kotlin_Float_Companion_SIZE_BITS_get(void * self);
+
+int32_t kotlin_Float_Companion_SIZE_BYTES_get(void * self);
+
+void * kotlin_Float_Companion_get();
+
+int32_t kotlin_Float_compareTo__TypesOfArguments__Swift_Int8__(void * self, int8_t other);
+
+int32_t kotlin_Float_compareTo__TypesOfArguments__Swift_Int16__(void * self, int16_t other);
+
+int32_t kotlin_Float_compareTo__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+int32_t kotlin_Float_compareTo__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+int32_t kotlin_Float_compareTo__TypesOfArguments__Swift_Float__(void * self, float other);
+
+int32_t kotlin_Float_compareTo__TypesOfArguments__Swift_Double__(void * self, double other);
+
+float kotlin_Float_dec(void * self);
+
+float kotlin_Float_div__TypesOfArguments__Swift_Float__(void * self, float other);
+
+_Bool kotlin_Float_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_Float_hashCode(void * self);
+
+float kotlin_Float_inc(void * self);
+
+float kotlin_Float_minus__TypesOfArguments__Swift_Float__(void * self, float other);
+
+float kotlin_Float_plus__TypesOfArguments__Swift_Float__(void * self, float other);
+
+float kotlin_Float_rem__TypesOfArguments__Swift_Float__(void * self, float other);
+
+float kotlin_Float_times__TypesOfArguments__Swift_Float__(void * self, float other);
+
+int8_t kotlin_Float_toByte(void * self);
+
+uint16_t kotlin_Float_toChar(void * self);
+
+double kotlin_Float_toDouble(void * self);
+
+int32_t kotlin_Float_toInt(void * self);
+
+int64_t kotlin_Float_toLong(void * self);
+
+int16_t kotlin_Float_toShort(void * self);
+
+NSString * kotlin_Float_toString(void * self);
+
+float kotlin_Float_unaryMinus(void * self);
+
+float kotlin_Float_unaryPlus(void * self);
+
 void * kotlin_IllegalArgumentException_init_allocate();
 
 void kotlin_IllegalArgumentException_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
@@ -37,10 +303,166 @@
 
 int32_t kotlin_IntArray_get__TypesOfArguments__Swift_Int32__(void * self, int32_t index);
 
+void * kotlin_IntArray_iterator(void * self);
+
 void kotlin_IntArray_set__TypesOfArguments__Swift_Int32_Swift_Int32__(void * self, int32_t index, int32_t value);
 
 int32_t kotlin_IntArray_size_get(void * self);
 
+int32_t kotlin_Int_Companion_MAX_VALUE_get(void * self);
+
+int32_t kotlin_Int_Companion_MIN_VALUE_get(void * self);
+
+int32_t kotlin_Int_Companion_SIZE_BITS_get(void * self);
+
+int32_t kotlin_Int_Companion_SIZE_BYTES_get(void * self);
+
+void * kotlin_Int_Companion_get();
+
+int32_t kotlin_Int_and__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+int32_t kotlin_Int_compareTo__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+int32_t kotlin_Int_dec(void * self);
+
+int32_t kotlin_Int_div__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+_Bool kotlin_Int_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_Int_hashCode(void * self);
+
+int32_t kotlin_Int_inc(void * self);
+
+int32_t kotlin_Int_inv(void * self);
+
+int32_t kotlin_Int_minus__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+int32_t kotlin_Int_or__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+int32_t kotlin_Int_plus__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+void * kotlin_Int_rangeTo__TypesOfArguments__Swift_Int8__(void * self, int8_t other);
+
+void * kotlin_Int_rangeTo__TypesOfArguments__Swift_Int16__(void * self, int16_t other);
+
+void * kotlin_Int_rangeTo__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+void * kotlin_Int_rangeTo__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+void * kotlin_Int_rangeUntil__TypesOfArguments__Swift_Int8__(void * self, int8_t other);
+
+void * kotlin_Int_rangeUntil__TypesOfArguments__Swift_Int16__(void * self, int16_t other);
+
+void * kotlin_Int_rangeUntil__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+void * kotlin_Int_rangeUntil__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+int32_t kotlin_Int_rem__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+int32_t kotlin_Int_shl__TypesOfArguments__Swift_Int32__(void * self, int32_t bitCount);
+
+int32_t kotlin_Int_shr__TypesOfArguments__Swift_Int32__(void * self, int32_t bitCount);
+
+int32_t kotlin_Int_times__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+int8_t kotlin_Int_toByte(void * self);
+
+uint16_t kotlin_Int_toChar(void * self);
+
+double kotlin_Int_toDouble(void * self);
+
+float kotlin_Int_toFloat(void * self);
+
+int64_t kotlin_Int_toLong(void * self);
+
+int16_t kotlin_Int_toShort(void * self);
+
+NSString * kotlin_Int_toString(void * self);
+
+int32_t kotlin_Int_unaryMinus(void * self);
+
+int32_t kotlin_Int_unaryPlus(void * self);
+
+int32_t kotlin_Int_ushr__TypesOfArguments__Swift_Int32__(void * self, int32_t bitCount);
+
+int32_t kotlin_Int_xor__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+int64_t kotlin_Long_Companion_MAX_VALUE_get(void * self);
+
+int64_t kotlin_Long_Companion_MIN_VALUE_get(void * self);
+
+int32_t kotlin_Long_Companion_SIZE_BITS_get(void * self);
+
+int32_t kotlin_Long_Companion_SIZE_BYTES_get(void * self);
+
+void * kotlin_Long_Companion_get();
+
+int64_t kotlin_Long_and__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+int32_t kotlin_Long_compareTo__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+int64_t kotlin_Long_dec(void * self);
+
+int64_t kotlin_Long_div__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+_Bool kotlin_Long_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_Long_hashCode(void * self);
+
+int64_t kotlin_Long_inc(void * self);
+
+int64_t kotlin_Long_inv(void * self);
+
+int64_t kotlin_Long_minus__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+int64_t kotlin_Long_or__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+int64_t kotlin_Long_plus__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+void * kotlin_Long_rangeTo__TypesOfArguments__Swift_Int8__(void * self, int8_t other);
+
+void * kotlin_Long_rangeTo__TypesOfArguments__Swift_Int16__(void * self, int16_t other);
+
+void * kotlin_Long_rangeTo__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+void * kotlin_Long_rangeTo__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+void * kotlin_Long_rangeUntil__TypesOfArguments__Swift_Int8__(void * self, int8_t other);
+
+void * kotlin_Long_rangeUntil__TypesOfArguments__Swift_Int16__(void * self, int16_t other);
+
+void * kotlin_Long_rangeUntil__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+void * kotlin_Long_rangeUntil__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+int64_t kotlin_Long_rem__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+int64_t kotlin_Long_shl__TypesOfArguments__Swift_Int32__(void * self, int32_t bitCount);
+
+int64_t kotlin_Long_shr__TypesOfArguments__Swift_Int32__(void * self, int32_t bitCount);
+
+int64_t kotlin_Long_times__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+int8_t kotlin_Long_toByte(void * self);
+
+uint16_t kotlin_Long_toChar(void * self);
+
+double kotlin_Long_toDouble(void * self);
+
+float kotlin_Long_toFloat(void * self);
+
+int32_t kotlin_Long_toInt(void * self);
+
+int16_t kotlin_Long_toShort(void * self);
+
+NSString * kotlin_Long_toString(void * self);
+
+int64_t kotlin_Long_unaryMinus(void * self);
+
+int64_t kotlin_Long_ushr__TypesOfArguments__Swift_Int32__(void * self, int32_t bitCount);
+
+int64_t kotlin_Long_xor__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
 int8_t kotlin_Number_toByte(void * self);
 
 uint16_t kotlin_Number_toChar(void * self);
@@ -65,8 +487,82 @@
 
 void kotlin_RuntimeException_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_ExportedKotlinPackages_kotlin_Throwable___(void * __kt, void * _Nullable cause);
 
+int16_t kotlin_Short_Companion_MAX_VALUE_get(void * self);
+
+int16_t kotlin_Short_Companion_MIN_VALUE_get(void * self);
+
+int32_t kotlin_Short_Companion_SIZE_BITS_get(void * self);
+
+int32_t kotlin_Short_Companion_SIZE_BYTES_get(void * self);
+
+void * kotlin_Short_Companion_get();
+
+int32_t kotlin_Short_compareTo__TypesOfArguments__Swift_Int16__(void * self, int16_t other);
+
+int16_t kotlin_Short_dec(void * self);
+
+_Bool kotlin_Short_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_Short_hashCode(void * self);
+
+int16_t kotlin_Short_inc(void * self);
+
+void * kotlin_Short_rangeTo__TypesOfArguments__Swift_Int8__(void * self, int8_t other);
+
+void * kotlin_Short_rangeTo__TypesOfArguments__Swift_Int16__(void * self, int16_t other);
+
+void * kotlin_Short_rangeTo__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+void * kotlin_Short_rangeTo__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+void * kotlin_Short_rangeUntil__TypesOfArguments__Swift_Int8__(void * self, int8_t other);
+
+void * kotlin_Short_rangeUntil__TypesOfArguments__Swift_Int16__(void * self, int16_t other);
+
+void * kotlin_Short_rangeUntil__TypesOfArguments__Swift_Int32__(void * self, int32_t other);
+
+void * kotlin_Short_rangeUntil__TypesOfArguments__Swift_Int64__(void * self, int64_t other);
+
+int8_t kotlin_Short_toByte(void * self);
+
+uint16_t kotlin_Short_toChar(void * self);
+
+double kotlin_Short_toDouble(void * self);
+
+float kotlin_Short_toFloat(void * self);
+
+int32_t kotlin_Short_toInt(void * self);
+
+int64_t kotlin_Short_toLong(void * self);
+
+NSString * kotlin_Short_toString(void * self);
+
+void * kotlin_String_Companion_get();
+
+int32_t kotlin_String_compareTo__TypesOfArguments__Swift_String__(void * self, NSString * other);
+
+_Bool kotlin_String_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+uint16_t kotlin_String_get__TypesOfArguments__Swift_Int32__(void * self, int32_t index);
+
+int32_t kotlin_String_hashCode(void * self);
+
+void * kotlin_String_init_allocate();
+
+void kotlin_String_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
+
+int32_t kotlin_String_length_get(void * self);
+
+NSString * kotlin_String_plus__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+void * kotlin_String_subSequence__TypesOfArguments__Swift_Int32_Swift_Int32__(void * self, int32_t startIndex, int32_t endIndex);
+
+NSString * kotlin_String_toString(void * self);
+
 void * _Nullable kotlin_Throwable_cause_get(void * self);
 
+void * kotlin_Throwable_getStackTrace(void * self);
+
 void * kotlin_Throwable_init_allocate();
 
 void kotlin_Throwable_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_Swift_String__Swift_Optional_ExportedKotlinPackages_kotlin_Throwable___(void * __kt, NSString * _Nullable message, void * _Nullable cause);
@@ -83,4 +579,246 @@
 
 NSString * kotlin_Throwable_toString(void * self);
 
+int8_t kotlin_collections_ByteIterator_next(void * self);
+
+int8_t kotlin_collections_ByteIterator_nextByte(void * self);
+
+uint16_t kotlin_collections_CharIterator_next(void * self);
+
+uint16_t kotlin_collections_CharIterator_nextChar(void * self);
+
+_Bool kotlin_collections_Collection_contains__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable element);
+
+_Bool kotlin_collections_Collection_containsAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(void * self, void * elements);
+
+_Bool kotlin_collections_Collection_isEmpty(void * self);
+
+void * kotlin_collections_Collection_iterator(void * self);
+
+int32_t kotlin_collections_Collection_size_get(void * self);
+
+int32_t kotlin_collections_IntIterator_next(void * self);
+
+int32_t kotlin_collections_IntIterator_nextInt(void * self);
+
+void * kotlin_collections_Iterable_iterator(void * self);
+
+_Bool kotlin_collections_Iterator_hasNext(void * self);
+
+void * _Nullable kotlin_collections_Iterator_next(void * self);
+
+int64_t kotlin_collections_LongIterator_next(void * self);
+
+int64_t kotlin_collections_LongIterator_nextLong(void * self);
+
+void * _Nullable kotlin_collections_Map_Entry_key_get(void * self);
+
+void * _Nullable kotlin_collections_Map_Entry_value_get(void * self);
+
+_Bool kotlin_collections_Map_containsKey__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable key);
+
+_Bool kotlin_collections_Map_containsValue__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable value);
+
+NSSet<id> * kotlin_collections_Map_entries_get(void * self);
+
+void * _Nullable kotlin_collections_Map_get__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable key);
+
+_Bool kotlin_collections_Map_isEmpty(void * self);
+
+NSSet<id> * kotlin_collections_Map_keys_get(void * self);
+
+int32_t kotlin_collections_Map_size_get(void * self);
+
+void * kotlin_collections_Map_values_get(void * self);
+
+_Bool kotlin_collections_MutableCollection_add__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable element);
+
+_Bool kotlin_collections_MutableCollection_addAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(void * self, void * elements);
+
+void kotlin_collections_MutableCollection_clear(void * self);
+
+void * kotlin_collections_MutableCollection_iterator(void * self);
+
+_Bool kotlin_collections_MutableCollection_remove__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable element);
+
+_Bool kotlin_collections_MutableCollection_removeAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(void * self, void * elements);
+
+_Bool kotlin_collections_MutableCollection_retainAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(void * self, void * elements);
+
+void * kotlin_collections_MutableIterable_iterator(void * self);
+
+void kotlin_collections_MutableIterator_remove(void * self);
+
+void * _Nullable kotlin_collections_MutableMap_MutableEntry_setValue__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable newValue);
+
+void kotlin_collections_MutableMap_clear(void * self);
+
+void * kotlin_collections_MutableMap_entries_get(void * self);
+
+void * kotlin_collections_MutableMap_keys_get(void * self);
+
+void * _Nullable kotlin_collections_MutableMap_put__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable key, void * _Nullable value);
+
+void kotlin_collections_MutableMap_putAll__TypesOfArguments__Swift_Dictionary_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase____(void * self, NSDictionary<id, id> * from);
+
+void * _Nullable kotlin_collections_MutableMap_remove__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable key);
+
+void * kotlin_collections_MutableMap_values_get(void * self);
+
+_Bool kotlin_collections_MutableSet_add__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable element);
+
+_Bool kotlin_collections_MutableSet_addAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(void * self, void * elements);
+
+void kotlin_collections_MutableSet_clear(void * self);
+
+void * kotlin_collections_MutableSet_iterator(void * self);
+
+_Bool kotlin_collections_MutableSet_remove__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable element);
+
+_Bool kotlin_collections_MutableSet_removeAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(void * self, void * elements);
+
+_Bool kotlin_collections_MutableSet_retainAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(void * self, void * elements);
+
+_Bool kotlin_collections_Set_contains__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable element);
+
+_Bool kotlin_collections_Set_containsAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(void * self, void * elements);
+
+_Bool kotlin_collections_Set_isEmpty(void * self);
+
+void * kotlin_collections_Set_iterator(void * self);
+
+int32_t kotlin_collections_Set_size_get(void * self);
+
+void * kotlin_ranges_CharProgression_Companion_fromClosedRange__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit_Swift_Unicode_UTF16_CodeUnit_Swift_Int32__(void * self, uint16_t rangeStart, uint16_t rangeEnd, int32_t step);
+
+void * kotlin_ranges_CharProgression_Companion_get();
+
+_Bool kotlin_ranges_CharProgression_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+uint16_t kotlin_ranges_CharProgression_first_get(void * self);
+
+int32_t kotlin_ranges_CharProgression_hashCode(void * self);
+
+_Bool kotlin_ranges_CharProgression_isEmpty(void * self);
+
+void * kotlin_ranges_CharProgression_iterator(void * self);
+
+uint16_t kotlin_ranges_CharProgression_last_get(void * self);
+
+int32_t kotlin_ranges_CharProgression_step_get(void * self);
+
+NSString * kotlin_ranges_CharProgression_toString(void * self);
+
+void * kotlin_ranges_CharRange_Companion_EMPTY_get(void * self);
+
+void * kotlin_ranges_CharRange_Companion_get();
+
+_Bool kotlin_ranges_CharRange_contains__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(void * self, uint16_t value);
+
+uint16_t kotlin_ranges_CharRange_endExclusive_get(void * self);
+
+uint16_t kotlin_ranges_CharRange_endInclusive_get(void * self);
+
+_Bool kotlin_ranges_CharRange_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_ranges_CharRange_hashCode(void * self);
+
+void * kotlin_ranges_CharRange_init_allocate();
+
+void kotlin_ranges_CharRange_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Unicode_UTF16_CodeUnit_Swift_Unicode_UTF16_CodeUnit__(void * __kt, uint16_t start, uint16_t endInclusive);
+
+_Bool kotlin_ranges_CharRange_isEmpty(void * self);
+
+uint16_t kotlin_ranges_CharRange_start_get(void * self);
+
+NSString * kotlin_ranges_CharRange_toString(void * self);
+
+void * kotlin_ranges_IntProgression_Companion_fromClosedRange__TypesOfArguments__Swift_Int32_Swift_Int32_Swift_Int32__(void * self, int32_t rangeStart, int32_t rangeEnd, int32_t step);
+
+void * kotlin_ranges_IntProgression_Companion_get();
+
+_Bool kotlin_ranges_IntProgression_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_ranges_IntProgression_first_get(void * self);
+
+int32_t kotlin_ranges_IntProgression_hashCode(void * self);
+
+_Bool kotlin_ranges_IntProgression_isEmpty(void * self);
+
+void * kotlin_ranges_IntProgression_iterator(void * self);
+
+int32_t kotlin_ranges_IntProgression_last_get(void * self);
+
+int32_t kotlin_ranges_IntProgression_step_get(void * self);
+
+NSString * kotlin_ranges_IntProgression_toString(void * self);
+
+void * kotlin_ranges_IntRange_Companion_EMPTY_get(void * self);
+
+void * kotlin_ranges_IntRange_Companion_get();
+
+_Bool kotlin_ranges_IntRange_contains__TypesOfArguments__Swift_Int32__(void * self, int32_t value);
+
+int32_t kotlin_ranges_IntRange_endExclusive_get(void * self);
+
+int32_t kotlin_ranges_IntRange_endInclusive_get(void * self);
+
+_Bool kotlin_ranges_IntRange_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_ranges_IntRange_hashCode(void * self);
+
+void * kotlin_ranges_IntRange_init_allocate();
+
+void kotlin_ranges_IntRange_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Int32_Swift_Int32__(void * __kt, int32_t start, int32_t endInclusive);
+
+_Bool kotlin_ranges_IntRange_isEmpty(void * self);
+
+int32_t kotlin_ranges_IntRange_start_get(void * self);
+
+NSString * kotlin_ranges_IntRange_toString(void * self);
+
+void * kotlin_ranges_LongProgression_Companion_fromClosedRange__TypesOfArguments__Swift_Int64_Swift_Int64_Swift_Int64__(void * self, int64_t rangeStart, int64_t rangeEnd, int64_t step);
+
+void * kotlin_ranges_LongProgression_Companion_get();
+
+_Bool kotlin_ranges_LongProgression_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int64_t kotlin_ranges_LongProgression_first_get(void * self);
+
+int32_t kotlin_ranges_LongProgression_hashCode(void * self);
+
+_Bool kotlin_ranges_LongProgression_isEmpty(void * self);
+
+void * kotlin_ranges_LongProgression_iterator(void * self);
+
+int64_t kotlin_ranges_LongProgression_last_get(void * self);
+
+int64_t kotlin_ranges_LongProgression_step_get(void * self);
+
+NSString * kotlin_ranges_LongProgression_toString(void * self);
+
+void * kotlin_ranges_LongRange_Companion_EMPTY_get(void * self);
+
+void * kotlin_ranges_LongRange_Companion_get();
+
+_Bool kotlin_ranges_LongRange_contains__TypesOfArguments__Swift_Int64__(void * self, int64_t value);
+
+int64_t kotlin_ranges_LongRange_endExclusive_get(void * self);
+
+int64_t kotlin_ranges_LongRange_endInclusive_get(void * self);
+
+_Bool kotlin_ranges_LongRange_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_ranges_LongRange_hashCode(void * self);
+
+void * kotlin_ranges_LongRange_init_allocate();
+
+void kotlin_ranges_LongRange_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Int64_Swift_Int64__(void * __kt, int64_t start, int64_t endInclusive);
+
+_Bool kotlin_ranges_LongRange_isEmpty(void * self);
+
+int64_t kotlin_ranges_LongRange_start_get(void * self);
+
+NSString * kotlin_ranges_LongRange_toString(void * self);
+
 NS_ASSUME_NONNULL_END
diff --git a/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinStdlib/KotlinStdlib.swift b/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinStdlib/KotlinStdlib.swift
index 82803de..9336289 100644
--- a/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinStdlib/KotlinStdlib.swift
+++ b/native/swift/swift-export-standalone-integration-tests/external/testData/generation/kotlinx-serialization-core/golden_result/KotlinStdlib/KotlinStdlib.swift
@@ -1,8 +1,27 @@
 @_exported import ExportedKotlinPackages
-import KotlinRuntimeSupport
 import KotlinRuntime
+import KotlinRuntimeSupport
 @_implementationOnly import KotlinBridges_KotlinStdlib
 
+public protocol _ExportedKotlinPackages_kotlin_collections_MutableMap_MutableEntry: KotlinRuntime.KotlinBase, KotlinStdlib._ExportedKotlinPackages_kotlin_collections_Map_Entry {
+    func setValue(
+        newValue: KotlinRuntime.KotlinBase?
+    ) -> KotlinRuntime.KotlinBase?
+}
+@objc(__ExportedKotlinPackages_kotlin_collections_MutableMap_MutableEntry)
+protocol __ExportedKotlinPackages_kotlin_collections_MutableMap_MutableEntry: KotlinStdlib.__ExportedKotlinPackages_kotlin_collections_Map_Entry {
+}
+public protocol _ExportedKotlinPackages_kotlin_collections_Map_Entry: KotlinRuntime.KotlinBase {
+    var key: KotlinRuntime.KotlinBase? {
+        get
+    }
+    var value: KotlinRuntime.KotlinBase? {
+        get
+    }
+}
+@objc(__ExportedKotlinPackages_kotlin_collections_Map_Entry)
+protocol __ExportedKotlinPackages_kotlin_collections_Map_Entry {
+}
 public extension ExportedKotlinPackages.kotlin {
     public protocol Annotation: KotlinRuntime.KotlinBase {
     }
@@ -29,6 +48,49 @@
     @objc(_CharSequence)
     protocol _CharSequence {
     }
+    public final class Array: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public var size: Swift.Int32 {
+            get {
+                return kotlin_Array_size_get(self.__externalRCRef())
+            }
+        }
+        public func _get(
+            index: Swift.Int32
+        ) -> KotlinRuntime.KotlinBase? {
+            return { switch kotlin_Array_get__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), index) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+        public func _set(
+            index: Swift.Int32,
+            value: KotlinRuntime.KotlinBase?
+        ) -> Swift.Void {
+            return kotlin_Array_set__TypesOfArguments__Swift_Int32_Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), index, value.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public func iterator() -> any ExportedKotlinPackages.kotlin.collections.Iterator {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_Array_iterator(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.Iterator
+        }
+        public init(
+            size: Swift.Int32,
+            `init`: @escaping (Swift.Int32) -> Swift.Optional<KotlinRuntime.KotlinBase>
+        ) {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+        public subscript(
+            index: Swift.Int32
+        ) -> KotlinRuntime.KotlinBase? {
+            get {
+                _get(index: index)
+            }
+            set(value) {
+                _set(index: index, value: value)
+            }
+        }
+    }
     public final class ByteArray: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
         public var size: Swift.Int32 {
             get {
@@ -47,7 +109,7 @@
             return kotlin_ByteArray_set__TypesOfArguments__Swift_Int32_Swift_Int8__(self.__externalRCRef(), index, value)
         }
         public func iterator() -> ExportedKotlinPackages.kotlin.collections.ByteIterator {
-            fatalError()
+            return ExportedKotlinPackages.kotlin.collections.ByteIterator.__createClassWrapper(externalRCRef: kotlin_ByteArray_iterator(self.__externalRCRef()))
         }
         public init(
             size: Swift.Int32
@@ -95,7 +157,7 @@
             return kotlin_IntArray_set__TypesOfArguments__Swift_Int32_Swift_Int32__(self.__externalRCRef(), index, value)
         }
         public func iterator() -> ExportedKotlinPackages.kotlin.collections.IntIterator {
-            fatalError()
+            return ExportedKotlinPackages.kotlin.collections.IntIterator.__createClassWrapper(externalRCRef: kotlin_IntArray_iterator(self.__externalRCRef()))
         }
         public init(
             size: Swift.Int32
@@ -126,8 +188,284 @@
         }
     }
     public final class Boolean: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public static var shared: ExportedKotlinPackages.kotlin.Boolean.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.Boolean.Companion.__createClassWrapper(externalRCRef: kotlin_Boolean_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public func _not() -> Swift.Bool {
+            return kotlin_Boolean_not(self.__externalRCRef())
+        }
+        public static prefix func !(
+            this: ExportedKotlinPackages.kotlin.Boolean
+        ) -> Swift.Bool {
+            this._not()
+        }
+        public func and(
+            other: Swift.Bool
+        ) -> Swift.Bool {
+            return kotlin_Boolean_and__TypesOfArguments__Swift_Bool__(self.__externalRCRef(), other)
+        }
+        public func or(
+            other: Swift.Bool
+        ) -> Swift.Bool {
+            return kotlin_Boolean_or__TypesOfArguments__Swift_Bool__(self.__externalRCRef(), other)
+        }
+        public func xor(
+            other: Swift.Bool
+        ) -> Swift.Bool {
+            return kotlin_Boolean_xor__TypesOfArguments__Swift_Bool__(self.__externalRCRef(), other)
+        }
+        public func _compareTo(
+            other: Swift.Bool
+        ) -> Swift.Int32 {
+            return kotlin_Boolean_compareTo__TypesOfArguments__Swift_Bool__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Boolean,
+            other: Swift.Bool
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Boolean,
+            other: Swift.Bool
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Boolean,
+            other: Swift.Bool
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Boolean,
+            other: Swift.Bool
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func toString() -> Swift.String {
+            return kotlin_Boolean_toString(self.__externalRCRef())
+        }
+        public func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_Boolean_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.Boolean,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public func hashCode() -> Swift.Int32 {
+            return kotlin_Boolean_hashCode(self.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     public final class Char: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public var MIN_VALUE: Swift.Unicode.UTF16.CodeUnit {
+                get {
+                    return kotlin_Char_Companion_MIN_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var MAX_VALUE: Swift.Unicode.UTF16.CodeUnit {
+                get {
+                    return kotlin_Char_Companion_MAX_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var MIN_HIGH_SURROGATE: Swift.Unicode.UTF16.CodeUnit {
+                get {
+                    return kotlin_Char_Companion_MIN_HIGH_SURROGATE_get(self.__externalRCRef())
+                }
+            }
+            public var MAX_HIGH_SURROGATE: Swift.Unicode.UTF16.CodeUnit {
+                get {
+                    return kotlin_Char_Companion_MAX_HIGH_SURROGATE_get(self.__externalRCRef())
+                }
+            }
+            public var MIN_LOW_SURROGATE: Swift.Unicode.UTF16.CodeUnit {
+                get {
+                    return kotlin_Char_Companion_MIN_LOW_SURROGATE_get(self.__externalRCRef())
+                }
+            }
+            public var MAX_LOW_SURROGATE: Swift.Unicode.UTF16.CodeUnit {
+                get {
+                    return kotlin_Char_Companion_MAX_LOW_SURROGATE_get(self.__externalRCRef())
+                }
+            }
+            public var MIN_SURROGATE: Swift.Unicode.UTF16.CodeUnit {
+                get {
+                    return kotlin_Char_Companion_MIN_SURROGATE_get(self.__externalRCRef())
+                }
+            }
+            public var MAX_SURROGATE: Swift.Unicode.UTF16.CodeUnit {
+                get {
+                    return kotlin_Char_Companion_MAX_SURROGATE_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BYTES: Swift.Int32 {
+                get {
+                    return kotlin_Char_Companion_SIZE_BYTES_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BITS: Swift.Int32 {
+                get {
+                    return kotlin_Char_Companion_SIZE_BITS_get(self.__externalRCRef())
+                }
+            }
+            public var MIN_SUPPLEMENTARY_CODE_POINT: Swift.Int32 {
+                get {
+                    return kotlin_Char_Companion_MIN_SUPPLEMENTARY_CODE_POINT_get(self.__externalRCRef())
+                }
+            }
+            public var MIN_CODE_POINT: Swift.Int32 {
+                get {
+                    return kotlin_Char_Companion_MIN_CODE_POINT_get(self.__externalRCRef())
+                }
+            }
+            public var MAX_CODE_POINT: Swift.Int32 {
+                get {
+                    return kotlin_Char_Companion_MAX_CODE_POINT_get(self.__externalRCRef())
+                }
+            }
+            @available(*, deprecated, message: "Introduce your own constant with the value of `2`. Replacement: 2")
+            public var MIN_RADIX: Swift.Int32 {
+                get {
+                    return kotlin_Char_Companion_MIN_RADIX_get(self.__externalRCRef())
+                }
+            }
+            @available(*, deprecated, message: "Introduce your own constant with the value of `36. Replacement: 36")
+            public var MAX_RADIX: Swift.Int32 {
+                get {
+                    return kotlin_Char_Companion_MAX_RADIX_get(self.__externalRCRef())
+                }
+            }
+            public static var shared: ExportedKotlinPackages.kotlin.Char.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.Char.Companion.__createClassWrapper(externalRCRef: kotlin_Char_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public func _compareTo(
+            other: Swift.Unicode.UTF16.CodeUnit
+        ) -> Swift.Int32 {
+            return kotlin_Char_compareTo__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Char,
+            other: Swift.Unicode.UTF16.CodeUnit
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Char,
+            other: Swift.Unicode.UTF16.CodeUnit
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Char,
+            other: Swift.Unicode.UTF16.CodeUnit
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Char,
+            other: Swift.Unicode.UTF16.CodeUnit
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func inc() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_Char_inc(self.__externalRCRef())
+        }
+        public func dec() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_Char_dec(self.__externalRCRef())
+        }
+        public func rangeTo(
+            other: Swift.Unicode.UTF16.CodeUnit
+        ) -> ExportedKotlinPackages.kotlin.ranges.CharRange {
+            return ExportedKotlinPackages.kotlin.ranges.CharRange.__createClassWrapper(externalRCRef: kotlin_Char_rangeTo__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Unicode.UTF16.CodeUnit
+        ) -> ExportedKotlinPackages.kotlin.ranges.CharRange {
+            return ExportedKotlinPackages.kotlin.ranges.CharRange.__createClassWrapper(externalRCRef: kotlin_Char_rangeUntil__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(self.__externalRCRef(), other))
+        }
+        @available(*, deprecated, message: "Conversion of Char to Number is deprecated. Use Char.code property instead.. Replacement: this.code.toByte()")
+        public func toByte() -> Swift.Int8 {
+            return kotlin_Char_toByte(self.__externalRCRef())
+        }
+        @available(*, deprecated, message: "Conversion of Char to Number is deprecated. Use Char.code property instead.. Replacement: this.code.toShort()")
+        public func toShort() -> Swift.Int16 {
+            return kotlin_Char_toShort(self.__externalRCRef())
+        }
+        @available(*, deprecated, message: "Conversion of Char to Number is deprecated. Use Char.code property instead.. Replacement: this.code")
+        public func toInt() -> Swift.Int32 {
+            return kotlin_Char_toInt(self.__externalRCRef())
+        }
+        @available(*, deprecated, message: "Conversion of Char to Number is deprecated. Use Char.code property instead.. Replacement: this.code.toLong()")
+        public func toLong() -> Swift.Int64 {
+            return kotlin_Char_toLong(self.__externalRCRef())
+        }
+        @available(*, deprecated, message: "Conversion of Char to Number is deprecated. Use Char.code property instead.. Replacement: this.code.toFloat()")
+        public func toFloat() -> Swift.Float {
+            return kotlin_Char_toFloat(self.__externalRCRef())
+        }
+        @available(*, deprecated, message: "Conversion of Char to Number is deprecated. Use Char.code property instead.. Replacement: this.code.toDouble()")
+        public func toDouble() -> Swift.Double {
+            return kotlin_Char_toDouble(self.__externalRCRef())
+        }
+        public func toString() -> Swift.String {
+            return kotlin_Char_toString(self.__externalRCRef())
+        }
+        public func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_Char_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.Char,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public func hashCode() -> Swift.Int32 {
+            return kotlin_Char_hashCode(self.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     open class Exception: ExportedKotlinPackages.kotlin.Throwable {
         public override init() {
@@ -247,18 +585,1629 @@
         }
     }
     public final class Byte: ExportedKotlinPackages.kotlin.Number {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public var MIN_VALUE: Swift.Int8 {
+                get {
+                    return kotlin_Byte_Companion_MIN_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var MAX_VALUE: Swift.Int8 {
+                get {
+                    return kotlin_Byte_Companion_MAX_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BYTES: Swift.Int32 {
+                get {
+                    return kotlin_Byte_Companion_SIZE_BYTES_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BITS: Swift.Int32 {
+                get {
+                    return kotlin_Byte_Companion_SIZE_BITS_get(self.__externalRCRef())
+                }
+            }
+            public static var shared: ExportedKotlinPackages.kotlin.Byte.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.Byte.Companion.__createClassWrapper(externalRCRef: kotlin_Byte_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public func _compareTo(
+            other: Swift.Int8
+        ) -> Swift.Int32 {
+            return kotlin_Byte_compareTo__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Byte,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Byte,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Byte,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Byte,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func inc() -> Swift.Int8 {
+            return kotlin_Byte_inc(self.__externalRCRef())
+        }
+        public func dec() -> Swift.Int8 {
+            return kotlin_Byte_dec(self.__externalRCRef())
+        }
+        public func rangeTo(
+            other: Swift.Int8
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Byte_rangeTo__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int16
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Byte_rangeTo__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int32
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Byte_rangeTo__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int64
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Byte_rangeTo__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int8
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Byte_rangeUntil__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int16
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Byte_rangeUntil__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int32
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Byte_rangeUntil__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int64
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Byte_rangeUntil__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other))
+        }
+        @available(*, deprecated, message: "Direct conversion to Char is deprecated. Use toInt().toChar() or Char constructor instead.. Replacement: this.toInt().toChar()")
+        public override func toChar() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_Byte_toChar(self.__externalRCRef())
+        }
+        public override func toShort() -> Swift.Int16 {
+            return kotlin_Byte_toShort(self.__externalRCRef())
+        }
+        public override func toInt() -> Swift.Int32 {
+            return kotlin_Byte_toInt(self.__externalRCRef())
+        }
+        public override func toLong() -> Swift.Int64 {
+            return kotlin_Byte_toLong(self.__externalRCRef())
+        }
+        public override func toFloat() -> Swift.Float {
+            return kotlin_Byte_toFloat(self.__externalRCRef())
+        }
+        public override func toDouble() -> Swift.Double {
+            return kotlin_Byte_toDouble(self.__externalRCRef())
+        }
+        public func toString() -> Swift.String {
+            return kotlin_Byte_toString(self.__externalRCRef())
+        }
+        public func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_Byte_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.Byte,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public func hashCode() -> Swift.Int32 {
+            return kotlin_Byte_hashCode(self.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     public final class Short: ExportedKotlinPackages.kotlin.Number {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public var MIN_VALUE: Swift.Int16 {
+                get {
+                    return kotlin_Short_Companion_MIN_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var MAX_VALUE: Swift.Int16 {
+                get {
+                    return kotlin_Short_Companion_MAX_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BYTES: Swift.Int32 {
+                get {
+                    return kotlin_Short_Companion_SIZE_BYTES_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BITS: Swift.Int32 {
+                get {
+                    return kotlin_Short_Companion_SIZE_BITS_get(self.__externalRCRef())
+                }
+            }
+            public static var shared: ExportedKotlinPackages.kotlin.Short.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.Short.Companion.__createClassWrapper(externalRCRef: kotlin_Short_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public func _compareTo(
+            other: Swift.Int16
+        ) -> Swift.Int32 {
+            return kotlin_Short_compareTo__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Short,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Short,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Short,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Short,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func inc() -> Swift.Int16 {
+            return kotlin_Short_inc(self.__externalRCRef())
+        }
+        public func dec() -> Swift.Int16 {
+            return kotlin_Short_dec(self.__externalRCRef())
+        }
+        public func rangeTo(
+            other: Swift.Int8
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Short_rangeTo__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int16
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Short_rangeTo__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int32
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Short_rangeTo__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int64
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Short_rangeTo__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int8
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Short_rangeUntil__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int16
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Short_rangeUntil__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int32
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Short_rangeUntil__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int64
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Short_rangeUntil__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other))
+        }
+        public override func toByte() -> Swift.Int8 {
+            return kotlin_Short_toByte(self.__externalRCRef())
+        }
+        @available(*, deprecated, message: "Direct conversion to Char is deprecated. Use toInt().toChar() or Char constructor instead.. Replacement: this.toInt().toChar()")
+        public override func toChar() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_Short_toChar(self.__externalRCRef())
+        }
+        public override func toInt() -> Swift.Int32 {
+            return kotlin_Short_toInt(self.__externalRCRef())
+        }
+        public override func toLong() -> Swift.Int64 {
+            return kotlin_Short_toLong(self.__externalRCRef())
+        }
+        public override func toFloat() -> Swift.Float {
+            return kotlin_Short_toFloat(self.__externalRCRef())
+        }
+        public override func toDouble() -> Swift.Double {
+            return kotlin_Short_toDouble(self.__externalRCRef())
+        }
+        public func toString() -> Swift.String {
+            return kotlin_Short_toString(self.__externalRCRef())
+        }
+        public func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_Short_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.Short,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public func hashCode() -> Swift.Int32 {
+            return kotlin_Short_hashCode(self.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     public final class Int: ExportedKotlinPackages.kotlin.Number {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public var MIN_VALUE: Swift.Int32 {
+                get {
+                    return kotlin_Int_Companion_MIN_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var MAX_VALUE: Swift.Int32 {
+                get {
+                    return kotlin_Int_Companion_MAX_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BYTES: Swift.Int32 {
+                get {
+                    return kotlin_Int_Companion_SIZE_BYTES_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BITS: Swift.Int32 {
+                get {
+                    return kotlin_Int_Companion_SIZE_BITS_get(self.__externalRCRef())
+                }
+            }
+            public static var shared: ExportedKotlinPackages.kotlin.Int.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.Int.Companion.__createClassWrapper(externalRCRef: kotlin_Int_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public func _compareTo(
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_compareTo__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Int,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Int,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Int,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Int,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _plus(
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_plus__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other)
+        }
+        public static func +(
+            this: ExportedKotlinPackages.kotlin.Int,
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            this._plus(other: other)
+        }
+        public func _minus(
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_minus__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other)
+        }
+        public static func -(
+            this: ExportedKotlinPackages.kotlin.Int,
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            this._minus(other: other)
+        }
+        public func _times(
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_times__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other)
+        }
+        public static func *(
+            this: ExportedKotlinPackages.kotlin.Int,
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            this._times(other: other)
+        }
+        public func _div(
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_div__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other)
+        }
+        public static func /(
+            this: ExportedKotlinPackages.kotlin.Int,
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            this._div(other: other)
+        }
+        public func _rem(
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_rem__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other)
+        }
+        public static func %(
+            this: ExportedKotlinPackages.kotlin.Int,
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            this._rem(other: other)
+        }
+        public func inc() -> Swift.Int32 {
+            return kotlin_Int_inc(self.__externalRCRef())
+        }
+        public func dec() -> Swift.Int32 {
+            return kotlin_Int_dec(self.__externalRCRef())
+        }
+        public func _unaryPlus() -> Swift.Int32 {
+            return kotlin_Int_unaryPlus(self.__externalRCRef())
+        }
+        public static prefix func +(
+            this: ExportedKotlinPackages.kotlin.Int
+        ) -> Swift.Int32 {
+            this._unaryPlus()
+        }
+        public func _unaryMinus() -> Swift.Int32 {
+            return kotlin_Int_unaryMinus(self.__externalRCRef())
+        }
+        public static prefix func -(
+            this: ExportedKotlinPackages.kotlin.Int
+        ) -> Swift.Int32 {
+            this._unaryMinus()
+        }
+        public func rangeTo(
+            other: Swift.Int8
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Int_rangeTo__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int16
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Int_rangeTo__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int32
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Int_rangeTo__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int64
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Int_rangeTo__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int8
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Int_rangeUntil__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int16
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Int_rangeUntil__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int32
+        ) -> ExportedKotlinPackages.kotlin.ranges.IntRange {
+            return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_Int_rangeUntil__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int64
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Int_rangeUntil__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other))
+        }
+        public func shl(
+            bitCount: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_shl__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), bitCount)
+        }
+        public func shr(
+            bitCount: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_shr__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), bitCount)
+        }
+        public func ushr(
+            bitCount: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_ushr__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), bitCount)
+        }
+        public func and(
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_and__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other)
+        }
+        public func or(
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_or__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other)
+        }
+        public func xor(
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Int_xor__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other)
+        }
+        public func inv() -> Swift.Int32 {
+            return kotlin_Int_inv(self.__externalRCRef())
+        }
+        public override func toByte() -> Swift.Int8 {
+            return kotlin_Int_toByte(self.__externalRCRef())
+        }
+        public override func toChar() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_Int_toChar(self.__externalRCRef())
+        }
+        public override func toShort() -> Swift.Int16 {
+            return kotlin_Int_toShort(self.__externalRCRef())
+        }
+        public override func toLong() -> Swift.Int64 {
+            return kotlin_Int_toLong(self.__externalRCRef())
+        }
+        public override func toFloat() -> Swift.Float {
+            return kotlin_Int_toFloat(self.__externalRCRef())
+        }
+        public override func toDouble() -> Swift.Double {
+            return kotlin_Int_toDouble(self.__externalRCRef())
+        }
+        public func toString() -> Swift.String {
+            return kotlin_Int_toString(self.__externalRCRef())
+        }
+        public func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_Int_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.Int,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public func hashCode() -> Swift.Int32 {
+            return kotlin_Int_hashCode(self.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     public final class Long: ExportedKotlinPackages.kotlin.Number {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public var MIN_VALUE: Swift.Int64 {
+                get {
+                    return kotlin_Long_Companion_MIN_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var MAX_VALUE: Swift.Int64 {
+                get {
+                    return kotlin_Long_Companion_MAX_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BYTES: Swift.Int32 {
+                get {
+                    return kotlin_Long_Companion_SIZE_BYTES_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BITS: Swift.Int32 {
+                get {
+                    return kotlin_Long_Companion_SIZE_BITS_get(self.__externalRCRef())
+                }
+            }
+            public static var shared: ExportedKotlinPackages.kotlin.Long.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.Long.Companion.__createClassWrapper(externalRCRef: kotlin_Long_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public func _compareTo(
+            other: Swift.Int64
+        ) -> Swift.Int32 {
+            return kotlin_Long_compareTo__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Long,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Long,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Long,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Long,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _plus(
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            return kotlin_Long_plus__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other)
+        }
+        public static func +(
+            this: ExportedKotlinPackages.kotlin.Long,
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            this._plus(other: other)
+        }
+        public func _minus(
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            return kotlin_Long_minus__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other)
+        }
+        public static func -(
+            this: ExportedKotlinPackages.kotlin.Long,
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            this._minus(other: other)
+        }
+        public func _times(
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            return kotlin_Long_times__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other)
+        }
+        public static func *(
+            this: ExportedKotlinPackages.kotlin.Long,
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            this._times(other: other)
+        }
+        public func _div(
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            return kotlin_Long_div__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other)
+        }
+        public static func /(
+            this: ExportedKotlinPackages.kotlin.Long,
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            this._div(other: other)
+        }
+        public func _rem(
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            return kotlin_Long_rem__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other)
+        }
+        public static func %(
+            this: ExportedKotlinPackages.kotlin.Long,
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            this._rem(other: other)
+        }
+        public func inc() -> Swift.Int64 {
+            return kotlin_Long_inc(self.__externalRCRef())
+        }
+        public func dec() -> Swift.Int64 {
+            return kotlin_Long_dec(self.__externalRCRef())
+        }
+        public func _unaryMinus() -> Swift.Int64 {
+            return kotlin_Long_unaryMinus(self.__externalRCRef())
+        }
+        public static prefix func -(
+            this: ExportedKotlinPackages.kotlin.Long
+        ) -> Swift.Int64 {
+            this._unaryMinus()
+        }
+        public func rangeTo(
+            other: Swift.Int8
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Long_rangeTo__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int16
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Long_rangeTo__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int32
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Long_rangeTo__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other))
+        }
+        public func rangeTo(
+            other: Swift.Int64
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Long_rangeTo__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int8
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Long_rangeUntil__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int16
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Long_rangeUntil__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int32
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Long_rangeUntil__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other))
+        }
+        public func rangeUntil(
+            other: Swift.Int64
+        ) -> ExportedKotlinPackages.kotlin.ranges.LongRange {
+            return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_Long_rangeUntil__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other))
+        }
+        public func shl(
+            bitCount: Swift.Int32
+        ) -> Swift.Int64 {
+            return kotlin_Long_shl__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), bitCount)
+        }
+        public func shr(
+            bitCount: Swift.Int32
+        ) -> Swift.Int64 {
+            return kotlin_Long_shr__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), bitCount)
+        }
+        public func ushr(
+            bitCount: Swift.Int32
+        ) -> Swift.Int64 {
+            return kotlin_Long_ushr__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), bitCount)
+        }
+        public func and(
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            return kotlin_Long_and__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other)
+        }
+        public func or(
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            return kotlin_Long_or__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other)
+        }
+        public func xor(
+            other: Swift.Int64
+        ) -> Swift.Int64 {
+            return kotlin_Long_xor__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other)
+        }
+        public func inv() -> Swift.Int64 {
+            return kotlin_Long_inv(self.__externalRCRef())
+        }
+        public override func toByte() -> Swift.Int8 {
+            return kotlin_Long_toByte(self.__externalRCRef())
+        }
+        @available(*, deprecated, message: "Direct conversion to Char is deprecated. Use toInt().toChar() or Char constructor instead.. Replacement: this.toInt().toChar()")
+        public override func toChar() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_Long_toChar(self.__externalRCRef())
+        }
+        public override func toShort() -> Swift.Int16 {
+            return kotlin_Long_toShort(self.__externalRCRef())
+        }
+        public override func toInt() -> Swift.Int32 {
+            return kotlin_Long_toInt(self.__externalRCRef())
+        }
+        public override func toFloat() -> Swift.Float {
+            return kotlin_Long_toFloat(self.__externalRCRef())
+        }
+        public override func toDouble() -> Swift.Double {
+            return kotlin_Long_toDouble(self.__externalRCRef())
+        }
+        public func toString() -> Swift.String {
+            return kotlin_Long_toString(self.__externalRCRef())
+        }
+        public func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_Long_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.Long,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public func hashCode() -> Swift.Int32 {
+            return kotlin_Long_hashCode(self.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     public final class Float: ExportedKotlinPackages.kotlin.Number {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public var MIN_VALUE: Swift.Float {
+                get {
+                    return kotlin_Float_Companion_MIN_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var MAX_VALUE: Swift.Float {
+                get {
+                    return kotlin_Float_Companion_MAX_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var POSITIVE_INFINITY: Swift.Float {
+                get {
+                    return kotlin_Float_Companion_POSITIVE_INFINITY_get(self.__externalRCRef())
+                }
+            }
+            public var NEGATIVE_INFINITY: Swift.Float {
+                get {
+                    return kotlin_Float_Companion_NEGATIVE_INFINITY_get(self.__externalRCRef())
+                }
+            }
+            public var NaN: Swift.Float {
+                get {
+                    return kotlin_Float_Companion_NaN_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BYTES: Swift.Int32 {
+                get {
+                    return kotlin_Float_Companion_SIZE_BYTES_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BITS: Swift.Int32 {
+                get {
+                    return kotlin_Float_Companion_SIZE_BITS_get(self.__externalRCRef())
+                }
+            }
+            public static var shared: ExportedKotlinPackages.kotlin.Float.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.Float.Companion.__createClassWrapper(externalRCRef: kotlin_Float_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public func _compareTo(
+            other: Swift.Int8
+        ) -> Swift.Int32 {
+            return kotlin_Float_compareTo__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _compareTo(
+            other: Swift.Int16
+        ) -> Swift.Int32 {
+            return kotlin_Float_compareTo__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _compareTo(
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Float_compareTo__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _compareTo(
+            other: Swift.Int64
+        ) -> Swift.Int32 {
+            return kotlin_Float_compareTo__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _compareTo(
+            other: Swift.Float
+        ) -> Swift.Int32 {
+            return kotlin_Float_compareTo__TypesOfArguments__Swift_Float__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Float
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Float
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Float
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Float
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _compareTo(
+            other: Swift.Double
+        ) -> Swift.Int32 {
+            return kotlin_Float_compareTo__TypesOfArguments__Swift_Double__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Double
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Double
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Double
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Double
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _plus(
+            other: Swift.Float
+        ) -> Swift.Float {
+            return kotlin_Float_plus__TypesOfArguments__Swift_Float__(self.__externalRCRef(), other)
+        }
+        public static func +(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Float
+        ) -> Swift.Float {
+            this._plus(other: other)
+        }
+        public func _minus(
+            other: Swift.Float
+        ) -> Swift.Float {
+            return kotlin_Float_minus__TypesOfArguments__Swift_Float__(self.__externalRCRef(), other)
+        }
+        public static func -(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Float
+        ) -> Swift.Float {
+            this._minus(other: other)
+        }
+        public func _times(
+            other: Swift.Float
+        ) -> Swift.Float {
+            return kotlin_Float_times__TypesOfArguments__Swift_Float__(self.__externalRCRef(), other)
+        }
+        public static func *(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Float
+        ) -> Swift.Float {
+            this._times(other: other)
+        }
+        public func _div(
+            other: Swift.Float
+        ) -> Swift.Float {
+            return kotlin_Float_div__TypesOfArguments__Swift_Float__(self.__externalRCRef(), other)
+        }
+        public static func /(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Float
+        ) -> Swift.Float {
+            this._div(other: other)
+        }
+        public func _rem(
+            other: Swift.Float
+        ) -> Swift.Float {
+            return kotlin_Float_rem__TypesOfArguments__Swift_Float__(self.__externalRCRef(), other)
+        }
+        public static func %(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: Swift.Float
+        ) -> Swift.Float {
+            this._rem(other: other)
+        }
+        public func inc() -> Swift.Float {
+            return kotlin_Float_inc(self.__externalRCRef())
+        }
+        public func dec() -> Swift.Float {
+            return kotlin_Float_dec(self.__externalRCRef())
+        }
+        public func _unaryPlus() -> Swift.Float {
+            return kotlin_Float_unaryPlus(self.__externalRCRef())
+        }
+        public static prefix func +(
+            this: ExportedKotlinPackages.kotlin.Float
+        ) -> Swift.Float {
+            this._unaryPlus()
+        }
+        public func _unaryMinus() -> Swift.Float {
+            return kotlin_Float_unaryMinus(self.__externalRCRef())
+        }
+        public static prefix func -(
+            this: ExportedKotlinPackages.kotlin.Float
+        ) -> Swift.Float {
+            this._unaryMinus()
+        }
+        @available(*, deprecated, message: "Unclear conversion. To achieve the same result convert to Int explicitly and then to Byte.. Replacement: toInt().toByte()")
+        public override func toByte() -> Swift.Int8 {
+            return kotlin_Float_toByte(self.__externalRCRef())
+        }
+        @available(*, deprecated, message: "Direct conversion to Char is deprecated. Use toInt().toChar() or Char constructor instead.. Replacement: this.toInt().toChar()")
+        public override func toChar() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_Float_toChar(self.__externalRCRef())
+        }
+        @available(*, deprecated, message: "Unclear conversion. To achieve the same result convert to Int explicitly and then to Short.. Replacement: toInt().toShort()")
+        public override func toShort() -> Swift.Int16 {
+            return kotlin_Float_toShort(self.__externalRCRef())
+        }
+        public override func toInt() -> Swift.Int32 {
+            return kotlin_Float_toInt(self.__externalRCRef())
+        }
+        public override func toLong() -> Swift.Int64 {
+            return kotlin_Float_toLong(self.__externalRCRef())
+        }
+        public override func toDouble() -> Swift.Double {
+            return kotlin_Float_toDouble(self.__externalRCRef())
+        }
+        public func toString() -> Swift.String {
+            return kotlin_Float_toString(self.__externalRCRef())
+        }
+        public func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_Float_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.Float,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public func hashCode() -> Swift.Int32 {
+            return kotlin_Float_hashCode(self.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     public final class Double: ExportedKotlinPackages.kotlin.Number {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public var MIN_VALUE: Swift.Double {
+                get {
+                    return kotlin_Double_Companion_MIN_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var MAX_VALUE: Swift.Double {
+                get {
+                    return kotlin_Double_Companion_MAX_VALUE_get(self.__externalRCRef())
+                }
+            }
+            public var POSITIVE_INFINITY: Swift.Double {
+                get {
+                    return kotlin_Double_Companion_POSITIVE_INFINITY_get(self.__externalRCRef())
+                }
+            }
+            public var NEGATIVE_INFINITY: Swift.Double {
+                get {
+                    return kotlin_Double_Companion_NEGATIVE_INFINITY_get(self.__externalRCRef())
+                }
+            }
+            public var NaN: Swift.Double {
+                get {
+                    return kotlin_Double_Companion_NaN_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BYTES: Swift.Int32 {
+                get {
+                    return kotlin_Double_Companion_SIZE_BYTES_get(self.__externalRCRef())
+                }
+            }
+            public var SIZE_BITS: Swift.Int32 {
+                get {
+                    return kotlin_Double_Companion_SIZE_BITS_get(self.__externalRCRef())
+                }
+            }
+            public static var shared: ExportedKotlinPackages.kotlin.Double.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.Double.Companion.__createClassWrapper(externalRCRef: kotlin_Double_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public func _compareTo(
+            other: Swift.Int8
+        ) -> Swift.Int32 {
+            return kotlin_Double_compareTo__TypesOfArguments__Swift_Int8__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int8
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _compareTo(
+            other: Swift.Int16
+        ) -> Swift.Int32 {
+            return kotlin_Double_compareTo__TypesOfArguments__Swift_Int16__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int16
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _compareTo(
+            other: Swift.Int32
+        ) -> Swift.Int32 {
+            return kotlin_Double_compareTo__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int32
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _compareTo(
+            other: Swift.Int64
+        ) -> Swift.Int32 {
+            return kotlin_Double_compareTo__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Int64
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _compareTo(
+            other: Swift.Float
+        ) -> Swift.Int32 {
+            return kotlin_Double_compareTo__TypesOfArguments__Swift_Float__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Float
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Float
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Float
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Float
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _compareTo(
+            other: Swift.Double
+        ) -> Swift.Int32 {
+            return kotlin_Double_compareTo__TypesOfArguments__Swift_Double__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Double
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Double
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Double
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Double
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func _plus(
+            other: Swift.Double
+        ) -> Swift.Double {
+            return kotlin_Double_plus__TypesOfArguments__Swift_Double__(self.__externalRCRef(), other)
+        }
+        public static func +(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Double
+        ) -> Swift.Double {
+            this._plus(other: other)
+        }
+        public func _minus(
+            other: Swift.Double
+        ) -> Swift.Double {
+            return kotlin_Double_minus__TypesOfArguments__Swift_Double__(self.__externalRCRef(), other)
+        }
+        public static func -(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Double
+        ) -> Swift.Double {
+            this._minus(other: other)
+        }
+        public func _times(
+            other: Swift.Double
+        ) -> Swift.Double {
+            return kotlin_Double_times__TypesOfArguments__Swift_Double__(self.__externalRCRef(), other)
+        }
+        public static func *(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Double
+        ) -> Swift.Double {
+            this._times(other: other)
+        }
+        public func _div(
+            other: Swift.Double
+        ) -> Swift.Double {
+            return kotlin_Double_div__TypesOfArguments__Swift_Double__(self.__externalRCRef(), other)
+        }
+        public static func /(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Double
+        ) -> Swift.Double {
+            this._div(other: other)
+        }
+        public func _rem(
+            other: Swift.Double
+        ) -> Swift.Double {
+            return kotlin_Double_rem__TypesOfArguments__Swift_Double__(self.__externalRCRef(), other)
+        }
+        public static func %(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: Swift.Double
+        ) -> Swift.Double {
+            this._rem(other: other)
+        }
+        public func inc() -> Swift.Double {
+            return kotlin_Double_inc(self.__externalRCRef())
+        }
+        public func dec() -> Swift.Double {
+            return kotlin_Double_dec(self.__externalRCRef())
+        }
+        public func _unaryPlus() -> Swift.Double {
+            return kotlin_Double_unaryPlus(self.__externalRCRef())
+        }
+        public static prefix func +(
+            this: ExportedKotlinPackages.kotlin.Double
+        ) -> Swift.Double {
+            this._unaryPlus()
+        }
+        public func _unaryMinus() -> Swift.Double {
+            return kotlin_Double_unaryMinus(self.__externalRCRef())
+        }
+        public static prefix func -(
+            this: ExportedKotlinPackages.kotlin.Double
+        ) -> Swift.Double {
+            this._unaryMinus()
+        }
+        @available(*, deprecated, message: "Unclear conversion. To achieve the same result convert to Int explicitly and then to Byte.. Replacement: toInt().toByte()")
+        public override func toByte() -> Swift.Int8 {
+            return kotlin_Double_toByte(self.__externalRCRef())
+        }
+        @available(*, deprecated, message: "Direct conversion to Char is deprecated. Use toInt().toChar() or Char constructor instead.. Replacement: this.toInt().toChar()")
+        public override func toChar() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_Double_toChar(self.__externalRCRef())
+        }
+        @available(*, deprecated, message: "Unclear conversion. To achieve the same result convert to Int explicitly and then to Short.. Replacement: toInt().toShort()")
+        public override func toShort() -> Swift.Int16 {
+            return kotlin_Double_toShort(self.__externalRCRef())
+        }
+        public override func toInt() -> Swift.Int32 {
+            return kotlin_Double_toInt(self.__externalRCRef())
+        }
+        public override func toLong() -> Swift.Int64 {
+            return kotlin_Double_toLong(self.__externalRCRef())
+        }
+        public override func toFloat() -> Swift.Float {
+            return kotlin_Double_toFloat(self.__externalRCRef())
+        }
+        public func toString() -> Swift.String {
+            return kotlin_Double_toString(self.__externalRCRef())
+        }
+        public func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_Double_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.Double,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public func hashCode() -> Swift.Int32 {
+            return kotlin_Double_hashCode(self.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
     public final class String: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlin.CharSequence, ExportedKotlinPackages.kotlin._CharSequence, KotlinRuntimeSupport._KotlinBridged {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public static var shared: ExportedKotlinPackages.kotlin.String.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.String.Companion.__createClassWrapper(externalRCRef: kotlin_String_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public var length: Swift.Int32 {
+            get {
+                return kotlin_String_length_get(self.__externalRCRef())
+            }
+        }
+        public func hashCode() -> Swift.Int32 {
+            return kotlin_String_hashCode(self.__externalRCRef())
+        }
+        public func _plus(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.String {
+            return kotlin_String_plus__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func +(
+            this: ExportedKotlinPackages.kotlin.String,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.String {
+            this._plus(other: other)
+        }
+        public func toString() -> Swift.String {
+            return kotlin_String_toString(self.__externalRCRef())
+        }
+        public func _get(
+            index: Swift.Int32
+        ) -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_String_get__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), index)
+        }
+        public func subSequence(
+            startIndex: Swift.Int32,
+            endIndex: Swift.Int32
+        ) -> any ExportedKotlinPackages.kotlin.CharSequence {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_String_subSequence__TypesOfArguments__Swift_Int32_Swift_Int32__(self.__externalRCRef(), startIndex, endIndex)) as! any ExportedKotlinPackages.kotlin.CharSequence
+        }
+        public func _compareTo(
+            other: Swift.String
+        ) -> Swift.Int32 {
+            return kotlin_String_compareTo__TypesOfArguments__Swift_String__(self.__externalRCRef(), other)
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.String,
+            other: Swift.String
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.String,
+            other: Swift.String
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.String,
+            other: Swift.String
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.String,
+            other: Swift.String
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_String_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.String,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public init() {
+            if Self.self != ExportedKotlinPackages.kotlin.String.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from ExportedKotlinPackages.kotlin.String ") }
+            let __kt = kotlin_String_init_allocate()
+            super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+            kotlin_String_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt)
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+        public subscript(
+            index: Swift.Int32
+        ) -> Swift.Unicode.UTF16.CodeUnit {
+            get {
+                _get(index: index)
+            }
+        }
     }
     open class Throwable: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
         open var message: Swift.String? {
@@ -271,8 +2220,8 @@
                 return { switch kotlin_Throwable_cause_get(self.__externalRCRef()) { case nil: .none; case let res: ExportedKotlinPackages.kotlin.Throwable.__createClassWrapper(externalRCRef: res); } }()
             }
         }
-        public final func getStackTrace() -> Swift.Never {
-            fatalError()
+        public final func getStackTrace() -> ExportedKotlinPackages.kotlin.Array {
+            return ExportedKotlinPackages.kotlin.Array.__createClassWrapper(externalRCRef: kotlin_Throwable_getStackTrace(self.__externalRCRef()))
         }
         public final func printStackTrace() -> Swift.Void {
             return kotlin_Throwable_printStackTrace(self.__externalRCRef())
@@ -318,14 +2267,6 @@
             super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
         }
     }
-    public final class UByte: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class UInt: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class ULong: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
-    public final class UShort: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
-    }
     open class Number: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
         open func toDouble() -> Swift.Double {
             return kotlin_Number_toDouble(self.__externalRCRef())
@@ -364,18 +2305,774 @@
         }
     }
 }
-public extension ExportedKotlinPackages.kotlin.time {
-    public final class Duration: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+public extension ExportedKotlinPackages.kotlin.collections {
+    public protocol Iterable: KotlinRuntime.KotlinBase {
+        func iterator() -> any ExportedKotlinPackages.kotlin.collections.Iterator
+    }
+    @objc(_Iterable)
+    protocol _Iterable {
+    }
+    public protocol Iterator: KotlinRuntime.KotlinBase {
+        func next() -> KotlinRuntime.KotlinBase?
+        func hasNext() -> Swift.Bool
+    }
+    @objc(_Iterator)
+    protocol _Iterator {
+    }
+    public protocol MutableMap: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlin.collections.Map {
+        typealias MutableEntry = KotlinStdlib._ExportedKotlinPackages_kotlin_collections_MutableMap_MutableEntry
+        var keys: any ExportedKotlinPackages.kotlin.collections.MutableSet {
+            get
+        }
+        var values: any ExportedKotlinPackages.kotlin.collections.MutableCollection {
+            get
+        }
+        var entries: any ExportedKotlinPackages.kotlin.collections.MutableSet {
+            get
+        }
+        func put(
+            key: KotlinRuntime.KotlinBase?,
+            value: KotlinRuntime.KotlinBase?
+        ) -> KotlinRuntime.KotlinBase?
+        func remove(
+            key: KotlinRuntime.KotlinBase?
+        ) -> KotlinRuntime.KotlinBase?
+        func putAll(
+            from: [KotlinRuntime.KotlinBase?: KotlinRuntime.KotlinBase?]
+        ) -> Swift.Void
+        func clear() -> Swift.Void
+    }
+    @objc(_MutableMap)
+    protocol _MutableMap: ExportedKotlinPackages.kotlin.collections._Map {
+    }
+    public protocol MutableCollection: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlin.collections.Collection, ExportedKotlinPackages.kotlin.collections.MutableIterable {
+        func iterator() -> any ExportedKotlinPackages.kotlin.collections.MutableIterator
+        func add(
+            element: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool
+        func remove(
+            element: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool
+        func addAll(
+            elements: any ExportedKotlinPackages.kotlin.collections.Collection
+        ) -> Swift.Bool
+        func removeAll(
+            elements: any ExportedKotlinPackages.kotlin.collections.Collection
+        ) -> Swift.Bool
+        func retainAll(
+            elements: any ExportedKotlinPackages.kotlin.collections.Collection
+        ) -> Swift.Bool
+        func clear() -> Swift.Void
+    }
+    @objc(_MutableCollection)
+    protocol _MutableCollection: ExportedKotlinPackages.kotlin.collections._Collection, ExportedKotlinPackages.kotlin.collections._MutableIterable {
+    }
+    public protocol Map: KotlinRuntime.KotlinBase {
+        typealias Entry = KotlinStdlib._ExportedKotlinPackages_kotlin_collections_Map_Entry
+        var size: Swift.Int32 {
+            get
+        }
+        var keys: Swift.Set<Swift.Optional<KotlinRuntime.KotlinBase>> {
+            get
+        }
+        var values: any ExportedKotlinPackages.kotlin.collections.Collection {
+            get
+        }
+        var entries: Swift.Set<any KotlinStdlib._ExportedKotlinPackages_kotlin_collections_Map_Entry> {
+            get
+        }
+        func isEmpty() -> Swift.Bool
+        func containsKey(
+            key: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool
+        func containsValue(
+            value: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool
+        func _get(
+            key: KotlinRuntime.KotlinBase?
+        ) -> KotlinRuntime.KotlinBase?
+        subscript(
+            key: KotlinRuntime.KotlinBase?
+        ) -> KotlinRuntime.KotlinBase? {
+            get
+        }
+    }
+    @objc(_Map)
+    protocol _Map {
+    }
+    public protocol MutableSet: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlin.collections.Set, ExportedKotlinPackages.kotlin.collections.MutableCollection {
+        func iterator() -> any ExportedKotlinPackages.kotlin.collections.MutableIterator
+        func add(
+            element: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool
+        func remove(
+            element: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool
+        func addAll(
+            elements: any ExportedKotlinPackages.kotlin.collections.Collection
+        ) -> Swift.Bool
+        func removeAll(
+            elements: any ExportedKotlinPackages.kotlin.collections.Collection
+        ) -> Swift.Bool
+        func retainAll(
+            elements: any ExportedKotlinPackages.kotlin.collections.Collection
+        ) -> Swift.Bool
+        func clear() -> Swift.Void
+    }
+    @objc(_MutableSet)
+    protocol _MutableSet: ExportedKotlinPackages.kotlin.collections._Set, ExportedKotlinPackages.kotlin.collections._MutableCollection {
+    }
+    public protocol Collection: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlin.collections.Iterable {
+        var size: Swift.Int32 {
+            get
+        }
+        func isEmpty() -> Swift.Bool
+        func contains(
+            element: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool
+        func ~=(
+            this: ExportedKotlinPackages.kotlin.collections.Collection,
+            element: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool
+        func iterator() -> any ExportedKotlinPackages.kotlin.collections.Iterator
+        func containsAll(
+            elements: any ExportedKotlinPackages.kotlin.collections.Collection
+        ) -> Swift.Bool
+    }
+    @objc(_Collection)
+    protocol _Collection: ExportedKotlinPackages.kotlin.collections._Iterable {
+    }
+    public protocol MutableIterable: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlin.collections.Iterable {
+        func iterator() -> any ExportedKotlinPackages.kotlin.collections.MutableIterator
+    }
+    @objc(_MutableIterable)
+    protocol _MutableIterable: ExportedKotlinPackages.kotlin.collections._Iterable {
+    }
+    public protocol MutableIterator: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlin.collections.Iterator {
+        func remove() -> Swift.Void
+    }
+    @objc(_MutableIterator)
+    protocol _MutableIterator: ExportedKotlinPackages.kotlin.collections._Iterator {
+    }
+    public protocol Set: KotlinRuntime.KotlinBase, ExportedKotlinPackages.kotlin.collections.Collection {
+        var size: Swift.Int32 {
+            get
+        }
+        func isEmpty() -> Swift.Bool
+        func contains(
+            element: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool
+        func ~=(
+            this: ExportedKotlinPackages.kotlin.collections.Set,
+            element: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool
+        func iterator() -> any ExportedKotlinPackages.kotlin.collections.Iterator
+        func containsAll(
+            elements: any ExportedKotlinPackages.kotlin.collections.Collection
+        ) -> Swift.Bool
+    }
+    @objc(_Set)
+    protocol _Set: ExportedKotlinPackages.kotlin.collections._Collection {
+    }
+    open class ByteIterator: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public final func next() -> Swift.Int8 {
+            return kotlin_collections_ByteIterator_next(self.__externalRCRef())
+        }
+        open func nextByte() -> Swift.Int8 {
+            return kotlin_collections_ByteIterator_nextByte(self.__externalRCRef())
+        }
+        package init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+    }
+    open class IntIterator: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public final func next() -> Swift.Int32 {
+            return kotlin_collections_IntIterator_next(self.__externalRCRef())
+        }
+        open func nextInt() -> Swift.Int32 {
+            return kotlin_collections_IntIterator_nextInt(self.__externalRCRef())
+        }
+        package init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+    }
+    open class CharIterator: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public final func next() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_collections_CharIterator_next(self.__externalRCRef())
+        }
+        open func nextChar() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_collections_CharIterator_nextChar(self.__externalRCRef())
+        }
+        package init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+    }
+    open class LongIterator: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public final func next() -> Swift.Int64 {
+            return kotlin_collections_LongIterator_next(self.__externalRCRef())
+        }
+        open func nextLong() -> Swift.Int64 {
+            return kotlin_collections_LongIterator_nextLong(self.__externalRCRef())
+        }
+        package init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
 }
 public extension ExportedKotlinPackages.kotlin.Annotation where Self : KotlinRuntimeSupport._KotlinBridged {
 }
 extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.Annotation where Wrapped : ExportedKotlinPackages.kotlin._Annotation {
 }
-public extension ExportedKotlinPackages.kotlin.collections {
-    open class ByteIterator: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+public extension ExportedKotlinPackages.kotlin.collections.Iterable where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func iterator() -> any ExportedKotlinPackages.kotlin.collections.Iterator {
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_collections_Iterable_iterator(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.Iterator
     }
-    open class IntIterator: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.collections.Iterable where Wrapped : ExportedKotlinPackages.kotlin.collections._Iterable {
+}
+public extension ExportedKotlinPackages.kotlin.collections.Iterator where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func next() -> KotlinRuntime.KotlinBase? {
+        return { switch kotlin_collections_Iterator_next(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+    }
+    public func hasNext() -> Swift.Bool {
+        return kotlin_collections_Iterator_hasNext(self.__externalRCRef())
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.collections.Iterator where Wrapped : ExportedKotlinPackages.kotlin.collections._Iterator {
+}
+public extension ExportedKotlinPackages.kotlin.collections.MutableMap where Self : KotlinRuntimeSupport._KotlinBridged {
+    public var keys: any ExportedKotlinPackages.kotlin.collections.MutableSet {
+        get {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_collections_MutableMap_keys_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.MutableSet
+        }
+    }
+    public var values: any ExportedKotlinPackages.kotlin.collections.MutableCollection {
+        get {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_collections_MutableMap_values_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.MutableCollection
+        }
+    }
+    public var entries: any ExportedKotlinPackages.kotlin.collections.MutableSet {
+        get {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_collections_MutableMap_entries_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.MutableSet
+        }
+    }
+    public func put(
+        key: KotlinRuntime.KotlinBase?,
+        value: KotlinRuntime.KotlinBase?
+    ) -> KotlinRuntime.KotlinBase? {
+        return { switch kotlin_collections_MutableMap_put__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), key.map { it in it.__externalRCRef() } ?? nil, value.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+    }
+    public func remove(
+        key: KotlinRuntime.KotlinBase?
+    ) -> KotlinRuntime.KotlinBase? {
+        return { switch kotlin_collections_MutableMap_remove__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), key.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+    }
+    public func putAll(
+        from: [KotlinRuntime.KotlinBase?: KotlinRuntime.KotlinBase?]
+    ) -> Swift.Void {
+        return kotlin_collections_MutableMap_putAll__TypesOfArguments__Swift_Dictionary_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase____(self.__externalRCRef(), Dictionary(uniqueKeysWithValues: from.map { key, value in (key as NSObject? ?? NSNull(), value as NSObject? ?? NSNull() )}))
+    }
+    public func clear() -> Swift.Void {
+        return kotlin_collections_MutableMap_clear(self.__externalRCRef())
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.collections.MutableMap where Wrapped : ExportedKotlinPackages.kotlin.collections._MutableMap {
+}
+public extension KotlinStdlib._ExportedKotlinPackages_kotlin_collections_MutableMap_MutableEntry where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func setValue(
+        newValue: KotlinRuntime.KotlinBase?
+    ) -> KotlinRuntime.KotlinBase? {
+        return { switch kotlin_collections_MutableMap_MutableEntry_setValue__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), newValue.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: KotlinStdlib._ExportedKotlinPackages_kotlin_collections_MutableMap_MutableEntry where Wrapped : KotlinStdlib.__ExportedKotlinPackages_kotlin_collections_MutableMap_MutableEntry {
+}
+public extension ExportedKotlinPackages.kotlin.ranges {
+    public final class CharRange: ExportedKotlinPackages.kotlin.ranges.CharProgression {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public var EMPTY: ExportedKotlinPackages.kotlin.ranges.CharRange {
+                get {
+                    return ExportedKotlinPackages.kotlin.ranges.CharRange.__createClassWrapper(externalRCRef: kotlin_ranges_CharRange_Companion_EMPTY_get(self.__externalRCRef()))
+                }
+            }
+            public static var shared: ExportedKotlinPackages.kotlin.ranges.CharRange.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.ranges.CharRange.Companion.__createClassWrapper(externalRCRef: kotlin_ranges_CharRange_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public var start: Swift.Unicode.UTF16.CodeUnit {
+            get {
+                return kotlin_ranges_CharRange_start_get(self.__externalRCRef())
+            }
+        }
+        public var endInclusive: Swift.Unicode.UTF16.CodeUnit {
+            get {
+                return kotlin_ranges_CharRange_endInclusive_get(self.__externalRCRef())
+            }
+        }
+        @available(*, deprecated, message: "Can throw an exception when it's impossible to represent the value with Char type, for example, when the range includes MAX_VALUE. It's recommended to use 'endInclusive' property that doesn't throw.")
+        public var endExclusive: Swift.Unicode.UTF16.CodeUnit {
+            get {
+                return kotlin_ranges_CharRange_endExclusive_get(self.__externalRCRef())
+            }
+        }
+        public func contains(
+            value: Swift.Unicode.UTF16.CodeUnit
+        ) -> Swift.Bool {
+            return kotlin_ranges_CharRange_contains__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(self.__externalRCRef(), value)
+        }
+        public static func ~=(
+            this: ExportedKotlinPackages.kotlin.ranges.CharRange,
+            value: Swift.Unicode.UTF16.CodeUnit
+        ) -> Swift.Bool {
+            this.contains(value: value)
+        }
+        public override func isEmpty() -> Swift.Bool {
+            return kotlin_ranges_CharRange_isEmpty(self.__externalRCRef())
+        }
+        public override func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_ranges_CharRange_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.ranges.CharRange,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public override func hashCode() -> Swift.Int32 {
+            return kotlin_ranges_CharRange_hashCode(self.__externalRCRef())
+        }
+        public override func toString() -> Swift.String {
+            return kotlin_ranges_CharRange_toString(self.__externalRCRef())
+        }
+        public init(
+            start: Swift.Unicode.UTF16.CodeUnit,
+            endInclusive: Swift.Unicode.UTF16.CodeUnit
+        ) {
+            if Self.self != ExportedKotlinPackages.kotlin.ranges.CharRange.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from ExportedKotlinPackages.kotlin.ranges.CharRange ") }
+            let __kt = kotlin_ranges_CharRange_init_allocate()
+            super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+            kotlin_ranges_CharRange_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Unicode_UTF16_CodeUnit_Swift_Unicode_UTF16_CodeUnit__(__kt, start, endInclusive)
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+    }
+    public final class IntRange: ExportedKotlinPackages.kotlin.ranges.IntProgression {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public var EMPTY: ExportedKotlinPackages.kotlin.ranges.IntRange {
+                get {
+                    return ExportedKotlinPackages.kotlin.ranges.IntRange.__createClassWrapper(externalRCRef: kotlin_ranges_IntRange_Companion_EMPTY_get(self.__externalRCRef()))
+                }
+            }
+            public static var shared: ExportedKotlinPackages.kotlin.ranges.IntRange.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.ranges.IntRange.Companion.__createClassWrapper(externalRCRef: kotlin_ranges_IntRange_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public var start: Swift.Int32 {
+            get {
+                return kotlin_ranges_IntRange_start_get(self.__externalRCRef())
+            }
+        }
+        public var endInclusive: Swift.Int32 {
+            get {
+                return kotlin_ranges_IntRange_endInclusive_get(self.__externalRCRef())
+            }
+        }
+        @available(*, deprecated, message: "Can throw an exception when it's impossible to represent the value with Int type, for example, when the range includes MAX_VALUE. It's recommended to use 'endInclusive' property that doesn't throw.")
+        public var endExclusive: Swift.Int32 {
+            get {
+                return kotlin_ranges_IntRange_endExclusive_get(self.__externalRCRef())
+            }
+        }
+        public func contains(
+            value: Swift.Int32
+        ) -> Swift.Bool {
+            return kotlin_ranges_IntRange_contains__TypesOfArguments__Swift_Int32__(self.__externalRCRef(), value)
+        }
+        public static func ~=(
+            this: ExportedKotlinPackages.kotlin.ranges.IntRange,
+            value: Swift.Int32
+        ) -> Swift.Bool {
+            this.contains(value: value)
+        }
+        public override func isEmpty() -> Swift.Bool {
+            return kotlin_ranges_IntRange_isEmpty(self.__externalRCRef())
+        }
+        public override func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_ranges_IntRange_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.ranges.IntRange,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public override func hashCode() -> Swift.Int32 {
+            return kotlin_ranges_IntRange_hashCode(self.__externalRCRef())
+        }
+        public override func toString() -> Swift.String {
+            return kotlin_ranges_IntRange_toString(self.__externalRCRef())
+        }
+        public init(
+            start: Swift.Int32,
+            endInclusive: Swift.Int32
+        ) {
+            if Self.self != ExportedKotlinPackages.kotlin.ranges.IntRange.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from ExportedKotlinPackages.kotlin.ranges.IntRange ") }
+            let __kt = kotlin_ranges_IntRange_init_allocate()
+            super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+            kotlin_ranges_IntRange_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Int32_Swift_Int32__(__kt, start, endInclusive)
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+    }
+    public final class LongRange: ExportedKotlinPackages.kotlin.ranges.LongProgression {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public var EMPTY: ExportedKotlinPackages.kotlin.ranges.LongRange {
+                get {
+                    return ExportedKotlinPackages.kotlin.ranges.LongRange.__createClassWrapper(externalRCRef: kotlin_ranges_LongRange_Companion_EMPTY_get(self.__externalRCRef()))
+                }
+            }
+            public static var shared: ExportedKotlinPackages.kotlin.ranges.LongRange.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.ranges.LongRange.Companion.__createClassWrapper(externalRCRef: kotlin_ranges_LongRange_Companion_get())
+                }
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public var start: Swift.Int64 {
+            get {
+                return kotlin_ranges_LongRange_start_get(self.__externalRCRef())
+            }
+        }
+        public var endInclusive: Swift.Int64 {
+            get {
+                return kotlin_ranges_LongRange_endInclusive_get(self.__externalRCRef())
+            }
+        }
+        @available(*, deprecated, message: "Can throw an exception when it's impossible to represent the value with Long type, for example, when the range includes MAX_VALUE. It's recommended to use 'endInclusive' property that doesn't throw.")
+        public var endExclusive: Swift.Int64 {
+            get {
+                return kotlin_ranges_LongRange_endExclusive_get(self.__externalRCRef())
+            }
+        }
+        public func contains(
+            value: Swift.Int64
+        ) -> Swift.Bool {
+            return kotlin_ranges_LongRange_contains__TypesOfArguments__Swift_Int64__(self.__externalRCRef(), value)
+        }
+        public static func ~=(
+            this: ExportedKotlinPackages.kotlin.ranges.LongRange,
+            value: Swift.Int64
+        ) -> Swift.Bool {
+            this.contains(value: value)
+        }
+        public override func isEmpty() -> Swift.Bool {
+            return kotlin_ranges_LongRange_isEmpty(self.__externalRCRef())
+        }
+        public override func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_ranges_LongRange_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.ranges.LongRange,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public override func hashCode() -> Swift.Int32 {
+            return kotlin_ranges_LongRange_hashCode(self.__externalRCRef())
+        }
+        public override func toString() -> Swift.String {
+            return kotlin_ranges_LongRange_toString(self.__externalRCRef())
+        }
+        public init(
+            start: Swift.Int64,
+            endInclusive: Swift.Int64
+        ) {
+            if Self.self != ExportedKotlinPackages.kotlin.ranges.LongRange.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from ExportedKotlinPackages.kotlin.ranges.LongRange ") }
+            let __kt = kotlin_ranges_LongRange_init_allocate()
+            super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+            kotlin_ranges_LongRange_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Int64_Swift_Int64__(__kt, start, endInclusive)
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+    }
+    open class CharProgression: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public static var shared: ExportedKotlinPackages.kotlin.ranges.CharProgression.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.ranges.CharProgression.Companion.__createClassWrapper(externalRCRef: kotlin_ranges_CharProgression_Companion_get())
+                }
+            }
+            public func fromClosedRange(
+                rangeStart: Swift.Unicode.UTF16.CodeUnit,
+                rangeEnd: Swift.Unicode.UTF16.CodeUnit,
+                step: Swift.Int32
+            ) -> ExportedKotlinPackages.kotlin.ranges.CharProgression {
+                return ExportedKotlinPackages.kotlin.ranges.CharProgression.__createClassWrapper(externalRCRef: kotlin_ranges_CharProgression_Companion_fromClosedRange__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit_Swift_Unicode_UTF16_CodeUnit_Swift_Int32__(self.__externalRCRef(), rangeStart, rangeEnd, step))
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public final var first: Swift.Unicode.UTF16.CodeUnit {
+            get {
+                return kotlin_ranges_CharProgression_first_get(self.__externalRCRef())
+            }
+        }
+        public final var last: Swift.Unicode.UTF16.CodeUnit {
+            get {
+                return kotlin_ranges_CharProgression_last_get(self.__externalRCRef())
+            }
+        }
+        public final var step: Swift.Int32 {
+            get {
+                return kotlin_ranges_CharProgression_step_get(self.__externalRCRef())
+            }
+        }
+        open func iterator() -> ExportedKotlinPackages.kotlin.collections.CharIterator {
+            return ExportedKotlinPackages.kotlin.collections.CharIterator.__createClassWrapper(externalRCRef: kotlin_ranges_CharProgression_iterator(self.__externalRCRef()))
+        }
+        open func isEmpty() -> Swift.Bool {
+            return kotlin_ranges_CharProgression_isEmpty(self.__externalRCRef())
+        }
+        open func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_ranges_CharProgression_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.ranges.CharProgression,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        open func hashCode() -> Swift.Int32 {
+            return kotlin_ranges_CharProgression_hashCode(self.__externalRCRef())
+        }
+        open func toString() -> Swift.String {
+            return kotlin_ranges_CharProgression_toString(self.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+    }
+    open class IntProgression: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public static var shared: ExportedKotlinPackages.kotlin.ranges.IntProgression.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.ranges.IntProgression.Companion.__createClassWrapper(externalRCRef: kotlin_ranges_IntProgression_Companion_get())
+                }
+            }
+            public func fromClosedRange(
+                rangeStart: Swift.Int32,
+                rangeEnd: Swift.Int32,
+                step: Swift.Int32
+            ) -> ExportedKotlinPackages.kotlin.ranges.IntProgression {
+                return ExportedKotlinPackages.kotlin.ranges.IntProgression.__createClassWrapper(externalRCRef: kotlin_ranges_IntProgression_Companion_fromClosedRange__TypesOfArguments__Swift_Int32_Swift_Int32_Swift_Int32__(self.__externalRCRef(), rangeStart, rangeEnd, step))
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public final var first: Swift.Int32 {
+            get {
+                return kotlin_ranges_IntProgression_first_get(self.__externalRCRef())
+            }
+        }
+        public final var last: Swift.Int32 {
+            get {
+                return kotlin_ranges_IntProgression_last_get(self.__externalRCRef())
+            }
+        }
+        public final var step: Swift.Int32 {
+            get {
+                return kotlin_ranges_IntProgression_step_get(self.__externalRCRef())
+            }
+        }
+        open func iterator() -> ExportedKotlinPackages.kotlin.collections.IntIterator {
+            return ExportedKotlinPackages.kotlin.collections.IntIterator.__createClassWrapper(externalRCRef: kotlin_ranges_IntProgression_iterator(self.__externalRCRef()))
+        }
+        open func isEmpty() -> Swift.Bool {
+            return kotlin_ranges_IntProgression_isEmpty(self.__externalRCRef())
+        }
+        open func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_ranges_IntProgression_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.ranges.IntProgression,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        open func hashCode() -> Swift.Int32 {
+            return kotlin_ranges_IntProgression_hashCode(self.__externalRCRef())
+        }
+        open func toString() -> Swift.String {
+            return kotlin_ranges_IntProgression_toString(self.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+    }
+    open class LongProgression: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public static var shared: ExportedKotlinPackages.kotlin.ranges.LongProgression.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.ranges.LongProgression.Companion.__createClassWrapper(externalRCRef: kotlin_ranges_LongProgression_Companion_get())
+                }
+            }
+            public func fromClosedRange(
+                rangeStart: Swift.Int64,
+                rangeEnd: Swift.Int64,
+                step: Swift.Int64
+            ) -> ExportedKotlinPackages.kotlin.ranges.LongProgression {
+                return ExportedKotlinPackages.kotlin.ranges.LongProgression.__createClassWrapper(externalRCRef: kotlin_ranges_LongProgression_Companion_fromClosedRange__TypesOfArguments__Swift_Int64_Swift_Int64_Swift_Int64__(self.__externalRCRef(), rangeStart, rangeEnd, step))
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            private init() {
+                fatalError()
+            }
+        }
+        public final var first: Swift.Int64 {
+            get {
+                return kotlin_ranges_LongProgression_first_get(self.__externalRCRef())
+            }
+        }
+        public final var last: Swift.Int64 {
+            get {
+                return kotlin_ranges_LongProgression_last_get(self.__externalRCRef())
+            }
+        }
+        public final var step: Swift.Int64 {
+            get {
+                return kotlin_ranges_LongProgression_step_get(self.__externalRCRef())
+            }
+        }
+        open func iterator() -> ExportedKotlinPackages.kotlin.collections.LongIterator {
+            return ExportedKotlinPackages.kotlin.collections.LongIterator.__createClassWrapper(externalRCRef: kotlin_ranges_LongProgression_iterator(self.__externalRCRef()))
+        }
+        open func isEmpty() -> Swift.Bool {
+            return kotlin_ranges_LongProgression_isEmpty(self.__externalRCRef())
+        }
+        open func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_ranges_LongProgression_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.ranges.LongProgression,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        open func hashCode() -> Swift.Int32 {
+            return kotlin_ranges_LongProgression_hashCode(self.__externalRCRef())
+        }
+        open func toString() -> Swift.String {
+            return kotlin_ranges_LongProgression_toString(self.__externalRCRef())
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
     }
 }
 public extension ExportedKotlinPackages.kotlin.CharSequence where Self : KotlinRuntimeSupport._KotlinBridged {
@@ -405,3 +3102,212 @@
 }
 extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.CharSequence where Wrapped : ExportedKotlinPackages.kotlin._CharSequence {
 }
+public extension ExportedKotlinPackages.kotlin.collections.MutableCollection where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func iterator() -> any ExportedKotlinPackages.kotlin.collections.MutableIterator {
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_collections_MutableCollection_iterator(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.MutableIterator
+    }
+    public func add(
+        element: KotlinRuntime.KotlinBase?
+    ) -> Swift.Bool {
+        return kotlin_collections_MutableCollection_add__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), element.map { it in it.__externalRCRef() } ?? nil)
+    }
+    public func remove(
+        element: KotlinRuntime.KotlinBase?
+    ) -> Swift.Bool {
+        return kotlin_collections_MutableCollection_remove__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), element.map { it in it.__externalRCRef() } ?? nil)
+    }
+    public func addAll(
+        elements: any ExportedKotlinPackages.kotlin.collections.Collection
+    ) -> Swift.Bool {
+        return kotlin_collections_MutableCollection_addAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(self.__externalRCRef(), elements.__externalRCRef())
+    }
+    public func removeAll(
+        elements: any ExportedKotlinPackages.kotlin.collections.Collection
+    ) -> Swift.Bool {
+        return kotlin_collections_MutableCollection_removeAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(self.__externalRCRef(), elements.__externalRCRef())
+    }
+    public func retainAll(
+        elements: any ExportedKotlinPackages.kotlin.collections.Collection
+    ) -> Swift.Bool {
+        return kotlin_collections_MutableCollection_retainAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(self.__externalRCRef(), elements.__externalRCRef())
+    }
+    public func clear() -> Swift.Void {
+        return kotlin_collections_MutableCollection_clear(self.__externalRCRef())
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.collections.MutableCollection where Wrapped : ExportedKotlinPackages.kotlin.collections._MutableCollection {
+}
+public extension ExportedKotlinPackages.kotlin.collections.Map where Self : KotlinRuntimeSupport._KotlinBridged {
+    public var size: Swift.Int32 {
+        get {
+            return kotlin_collections_Map_size_get(self.__externalRCRef())
+        }
+    }
+    public var keys: Swift.Set<Swift.Optional<KotlinRuntime.KotlinBase>> {
+        get {
+            return kotlin_collections_Map_keys_get(self.__externalRCRef()) as! Swift.Set<Swift.Optional<KotlinRuntime.KotlinBase>>
+        }
+    }
+    public var values: any ExportedKotlinPackages.kotlin.collections.Collection {
+        get {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_collections_Map_values_get(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.Collection
+        }
+    }
+    public var entries: Swift.Set<any KotlinStdlib._ExportedKotlinPackages_kotlin_collections_Map_Entry> {
+        get {
+            return kotlin_collections_Map_entries_get(self.__externalRCRef()) as! Swift.Set<any KotlinStdlib._ExportedKotlinPackages_kotlin_collections_Map_Entry>
+        }
+    }
+    public func isEmpty() -> Swift.Bool {
+        return kotlin_collections_Map_isEmpty(self.__externalRCRef())
+    }
+    public func containsKey(
+        key: KotlinRuntime.KotlinBase?
+    ) -> Swift.Bool {
+        return kotlin_collections_Map_containsKey__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), key.map { it in it.__externalRCRef() } ?? nil)
+    }
+    public func containsValue(
+        value: KotlinRuntime.KotlinBase?
+    ) -> Swift.Bool {
+        return kotlin_collections_Map_containsValue__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), value.map { it in it.__externalRCRef() } ?? nil)
+    }
+    public func _get(
+        key: KotlinRuntime.KotlinBase?
+    ) -> KotlinRuntime.KotlinBase? {
+        return { switch kotlin_collections_Map_get__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), key.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+    }
+    public subscript(
+        key: KotlinRuntime.KotlinBase?
+    ) -> KotlinRuntime.KotlinBase? {
+        get {
+            _get(key: key)
+        }
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.collections.Map where Wrapped : ExportedKotlinPackages.kotlin.collections._Map {
+}
+public extension ExportedKotlinPackages.kotlin.collections.MutableSet where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func iterator() -> any ExportedKotlinPackages.kotlin.collections.MutableIterator {
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_collections_MutableSet_iterator(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.MutableIterator
+    }
+    public func add(
+        element: KotlinRuntime.KotlinBase?
+    ) -> Swift.Bool {
+        return kotlin_collections_MutableSet_add__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), element.map { it in it.__externalRCRef() } ?? nil)
+    }
+    public func remove(
+        element: KotlinRuntime.KotlinBase?
+    ) -> Swift.Bool {
+        return kotlin_collections_MutableSet_remove__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), element.map { it in it.__externalRCRef() } ?? nil)
+    }
+    public func addAll(
+        elements: any ExportedKotlinPackages.kotlin.collections.Collection
+    ) -> Swift.Bool {
+        return kotlin_collections_MutableSet_addAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(self.__externalRCRef(), elements.__externalRCRef())
+    }
+    public func removeAll(
+        elements: any ExportedKotlinPackages.kotlin.collections.Collection
+    ) -> Swift.Bool {
+        return kotlin_collections_MutableSet_removeAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(self.__externalRCRef(), elements.__externalRCRef())
+    }
+    public func retainAll(
+        elements: any ExportedKotlinPackages.kotlin.collections.Collection
+    ) -> Swift.Bool {
+        return kotlin_collections_MutableSet_retainAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(self.__externalRCRef(), elements.__externalRCRef())
+    }
+    public func clear() -> Swift.Void {
+        return kotlin_collections_MutableSet_clear(self.__externalRCRef())
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.collections.MutableSet where Wrapped : ExportedKotlinPackages.kotlin.collections._MutableSet {
+}
+public extension KotlinStdlib._ExportedKotlinPackages_kotlin_collections_Map_Entry where Self : KotlinRuntimeSupport._KotlinBridged {
+    public var key: KotlinRuntime.KotlinBase? {
+        get {
+            return { switch kotlin_collections_Map_Entry_key_get(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+    }
+    public var value: KotlinRuntime.KotlinBase? {
+        get {
+            return { switch kotlin_collections_Map_Entry_value_get(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: KotlinStdlib._ExportedKotlinPackages_kotlin_collections_Map_Entry where Wrapped : KotlinStdlib.__ExportedKotlinPackages_kotlin_collections_Map_Entry {
+}
+public extension ExportedKotlinPackages.kotlin.collections.Collection where Self : KotlinRuntimeSupport._KotlinBridged {
+    public var size: Swift.Int32 {
+        get {
+            return kotlin_collections_Collection_size_get(self.__externalRCRef())
+        }
+    }
+    public func isEmpty() -> Swift.Bool {
+        return kotlin_collections_Collection_isEmpty(self.__externalRCRef())
+    }
+    public func contains(
+        element: KotlinRuntime.KotlinBase?
+    ) -> Swift.Bool {
+        return kotlin_collections_Collection_contains__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), element.map { it in it.__externalRCRef() } ?? nil)
+    }
+    public static func ~=(
+        this: ExportedKotlinPackages.kotlin.collections.Collection,
+        element: KotlinRuntime.KotlinBase?
+    ) -> Swift.Bool {
+        this.contains(element: element)
+    }
+    public func iterator() -> any ExportedKotlinPackages.kotlin.collections.Iterator {
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_collections_Collection_iterator(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.Iterator
+    }
+    public func containsAll(
+        elements: any ExportedKotlinPackages.kotlin.collections.Collection
+    ) -> Swift.Bool {
+        return kotlin_collections_Collection_containsAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(self.__externalRCRef(), elements.__externalRCRef())
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.collections.Collection where Wrapped : ExportedKotlinPackages.kotlin.collections._Collection {
+}
+public extension ExportedKotlinPackages.kotlin.collections.MutableIterable where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func iterator() -> any ExportedKotlinPackages.kotlin.collections.MutableIterator {
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_collections_MutableIterable_iterator(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.MutableIterator
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.collections.MutableIterable where Wrapped : ExportedKotlinPackages.kotlin.collections._MutableIterable {
+}
+public extension ExportedKotlinPackages.kotlin.collections.MutableIterator where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func remove() -> Swift.Void {
+        return kotlin_collections_MutableIterator_remove(self.__externalRCRef())
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.collections.MutableIterator where Wrapped : ExportedKotlinPackages.kotlin.collections._MutableIterator {
+}
+public extension ExportedKotlinPackages.kotlin.collections.Set where Self : KotlinRuntimeSupport._KotlinBridged {
+    public var size: Swift.Int32 {
+        get {
+            return kotlin_collections_Set_size_get(self.__externalRCRef())
+        }
+    }
+    public func isEmpty() -> Swift.Bool {
+        return kotlin_collections_Set_isEmpty(self.__externalRCRef())
+    }
+    public func contains(
+        element: KotlinRuntime.KotlinBase?
+    ) -> Swift.Bool {
+        return kotlin_collections_Set_contains__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), element.map { it in it.__externalRCRef() } ?? nil)
+    }
+    public static func ~=(
+        this: ExportedKotlinPackages.kotlin.collections.Set,
+        element: KotlinRuntime.KotlinBase?
+    ) -> Swift.Bool {
+        this.contains(element: element)
+    }
+    public func iterator() -> any ExportedKotlinPackages.kotlin.collections.Iterator {
+        return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: kotlin_collections_Set_iterator(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.Iterator
+    }
+    public func containsAll(
+        elements: any ExportedKotlinPackages.kotlin.collections.Collection
+    ) -> Swift.Bool {
+        return kotlin_collections_Set_containsAll__TypesOfArguments__anyU20ExportedKotlinPackages_kotlin_collections_Collection__(self.__externalRCRef(), elements.__externalRCRef())
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.collections.Set where Wrapped : ExportedKotlinPackages.kotlin.collections._Set {
+}
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/execution/generics/generics.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/execution/generics/generics.kt
index 0160e12..4c3bfb0 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/execution/generics/generics.kt
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/execution/generics/generics.kt
@@ -1,8 +1,18 @@
 // KIND: STANDALONE
 // MODULE: Generics
 // FILE: generics.kt
-class Foo
+class Foo(val i: Int)
 
 fun <T> id(param: T): T {
     return param
-}
\ No newline at end of file
+}
+
+abstract class Box<T>(open var t: T)
+class DefaultBox<T>(t: T): Box<T>(t)
+class IntBox(override var t: Int): Box<Int>(t)
+class TripleBox(i: Int): Box<Box<Box<Foo>>>(DefaultBox(DefaultBox(Foo(i)))) {
+    fun unwrap() = t.t.t.i
+    fun set(newValue: Int) {
+        t.t.t = Foo(newValue)
+    }
+}
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/execution/generics/generics.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/execution/generics/generics.swift
index 34cfb33..0b64c16 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/execution/generics/generics.swift
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/execution/generics/generics.swift
@@ -3,7 +3,29 @@
 
 @Test
 func smoke() throws {
-    let foo = Foo()
+    let foo = Foo(i: 5)
     try #require(foo == id(param: foo))
     try #require(nil == id(param: nil))
-}
\ No newline at end of file
+}
+
+@Test
+func tripleBox() throws {
+    let tb = TripleBox(i: 5)
+    let db = tb.t as! Box
+    try #require((((tb.t as! Box).t as! Box).t as! Foo).i == 5)
+    try #require(((db.t as! Box).t as! Foo).i == 5)
+    try #require(tb.unwrap() == 5)
+
+    tb.set(newValue: 3)
+    try #require(((db.t as! Box).t as! Foo).i == 3)
+}
+
+@Test
+func primitiveBox() throws {
+    let ib = IntBox(t: 5)
+    try #require(ib.t == 5)
+    ib.t = 3
+    try #require(ib.t == 3)
+}
+
+
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.h b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.h
index ed287ad..4abad4e 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.h
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.h
@@ -119,6 +119,18 @@
 
 void OBJECT_NO_PACKAGE_variable_set__TypesOfArguments__Swift_Int32__(void * self, int32_t newValue);
 
+_Bool OBJECT_WITH_GENERIC_INHERITANCE_hasNext(void * self);
+
+_Bool OBJECT_WITH_GENERIC_INHERITANCE_hasPrevious(void * self);
+
+void OBJECT_WITH_GENERIC_INHERITANCE_next(void * self) __attribute((noreturn));
+
+int32_t OBJECT_WITH_GENERIC_INHERITANCE_nextIndex(void * self);
+
+void OBJECT_WITH_GENERIC_INHERITANCE_previous(void * self) __attribute((noreturn));
+
+int32_t OBJECT_WITH_GENERIC_INHERITANCE_previousIndex(void * self);
+
 void * SEALED_C_init_allocate();
 
 void SEALED_C_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
@@ -147,8 +159,22 @@
 
 void __root___Foo_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Float__(void * __kt, float f);
 
+void * __root___GENERIC_CLASS_init_allocate();
+
+void __root___GENERIC_CLASS_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
+
+void * __root___INHERITANCE_GENERIC_init_allocate();
+
+void __root___INHERITANCE_GENERIC_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
+
+void * __root___INHERITANCE_UNSUPPORTED_BASE_init_allocate();
+
+void __root___INHERITANCE_UNSUPPORTED_BASE_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
+
 void * __root___OBJECT_NO_PACKAGE_get();
 
+void * __root___OBJECT_WITH_GENERIC_INHERITANCE_get();
+
 void * namespace_Foo_INSIDE_CLASS_init_allocate();
 
 void namespace_Foo_INSIDE_CLASS_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.kt
index e124261..44d575b 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.kt
@@ -24,6 +24,7 @@
 @file:kotlin.native.internal.objc.BindClassToObjCName(Foo::class, "4main3FooC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(Foo.Companion::class, "4main3FooC9CompanionC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(Foo.INSIDE_CLASS::class, "4main3FooC12INSIDE_CLASSC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(GENERIC_CLASS::class, "4main13GENERIC_CLASSC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(INHERITANCE_GENERIC::class, "4main19INHERITANCE_GENERICC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(INHERITANCE_UNSUPPORTED_BASE::class, "4main28INHERITANCE_UNSUPPORTED_BASEC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(OBJECT_NO_PACKAGE::class, "4main17OBJECT_NO_PACKAGEC")
@@ -439,6 +440,48 @@
     __self.variable = __newValue
 }
 
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_hasNext")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_hasNext(self: kotlin.native.internal.NativePtr): Boolean {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.hasNext()
+    return _result
+}
+
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_hasPrevious")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_hasPrevious(self: kotlin.native.internal.NativePtr): Boolean {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.hasPrevious()
+    return _result
+}
+
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_next")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_next(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.next()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_nextIndex")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_nextIndex(self: kotlin.native.internal.NativePtr): Int {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.nextIndex()
+    return _result
+}
+
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_previous")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_previous(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.previous()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_previousIndex")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_previousIndex(self: kotlin.native.internal.NativePtr): Int {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.previousIndex()
+    return _result
+}
+
 @ExportedBridge("SEALED_C_init_allocate")
 public fun SEALED_C_init_allocate(): kotlin.native.internal.NativePtr {
     val _result = kotlin.native.internal.createUninitializedInstance<SEALED.C>()
@@ -530,12 +573,54 @@
     kotlin.native.internal.initInstance(____kt, Foo(__f))
 }
 
+@ExportedBridge("__root___GENERIC_CLASS_init_allocate")
+public fun __root___GENERIC_CLASS_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<GENERIC_CLASS<kotlin.Any?>>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___GENERIC_CLASS_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__")
+public fun __root___GENERIC_CLASS_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    kotlin.native.internal.initInstance(____kt, GENERIC_CLASS<kotlin.Any?>())
+}
+
+@ExportedBridge("__root___INHERITANCE_GENERIC_init_allocate")
+public fun __root___INHERITANCE_GENERIC_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<INHERITANCE_GENERIC>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___INHERITANCE_GENERIC_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__")
+public fun __root___INHERITANCE_GENERIC_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    kotlin.native.internal.initInstance(____kt, INHERITANCE_GENERIC())
+}
+
+@ExportedBridge("__root___INHERITANCE_UNSUPPORTED_BASE_init_allocate")
+public fun __root___INHERITANCE_UNSUPPORTED_BASE_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<INHERITANCE_UNSUPPORTED_BASE>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___INHERITANCE_UNSUPPORTED_BASE_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__")
+public fun __root___INHERITANCE_UNSUPPORTED_BASE_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    kotlin.native.internal.initInstance(____kt, INHERITANCE_UNSUPPORTED_BASE())
+}
+
 @ExportedBridge("__root___OBJECT_NO_PACKAGE_get")
 public fun __root___OBJECT_NO_PACKAGE_get(): kotlin.native.internal.NativePtr {
     val _result = OBJECT_NO_PACKAGE
     return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
 }
 
+@ExportedBridge("__root___OBJECT_WITH_GENERIC_INHERITANCE_get")
+public fun __root___OBJECT_WITH_GENERIC_INHERITANCE_get(): kotlin.native.internal.NativePtr {
+    val _result = OBJECT_WITH_GENERIC_INHERITANCE
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
 @ExportedBridge("namespace_Foo_INSIDE_CLASS_init_allocate")
 public fun namespace_Foo_INSIDE_CLASS_init_allocate(): kotlin.native.internal.NativePtr {
     val _result = kotlin.native.internal.createUninitializedInstance<namespace.Foo.INSIDE_CLASS>()
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.swift
index 305cb01..49bffde 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/classes/golden_result/main/main.swift
@@ -346,9 +346,47 @@
         return Foo_foo(self.__externalRCRef())
     }
 }
-open class INHERITANCE_GENERIC: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+open class GENERIC_CLASS: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    public init() {
+        if Self.self != main.GENERIC_CLASS.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.GENERIC_CLASS ") }
+        let __kt = __root___GENERIC_CLASS_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___GENERIC_CLASS_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt)
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
+}
+open class INHERITANCE_GENERIC: main.GENERIC_CLASS {
+    public override init() {
+        if Self.self != main.INHERITANCE_GENERIC.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.INHERITANCE_GENERIC ") }
+        let __kt = __root___INHERITANCE_GENERIC_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___INHERITANCE_GENERIC_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt)
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
 }
 public final class INHERITANCE_UNSUPPORTED_BASE: main.INHERITANCE_GENERIC {
+    public override init() {
+        if Self.self != main.INHERITANCE_UNSUPPORTED_BASE.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.INHERITANCE_UNSUPPORTED_BASE ") }
+        let __kt = __root___INHERITANCE_UNSUPPORTED_BASE_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___INHERITANCE_UNSUPPORTED_BASE_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt)
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
 }
 public final class OBJECT_NO_PACKAGE: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
     public final class Bar: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
@@ -470,6 +508,38 @@
     }
 }
 public final class OBJECT_WITH_GENERIC_INHERITANCE: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    public static var shared: main.OBJECT_WITH_GENERIC_INHERITANCE {
+        get {
+            return main.OBJECT_WITH_GENERIC_INHERITANCE.__createClassWrapper(externalRCRef: __root___OBJECT_WITH_GENERIC_INHERITANCE_get())
+        }
+    }
+    private init() {
+        fatalError()
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
+    public func hasNext() -> Swift.Bool {
+        return OBJECT_WITH_GENERIC_INHERITANCE_hasNext(self.__externalRCRef())
+    }
+    public func hasPrevious() -> Swift.Bool {
+        return OBJECT_WITH_GENERIC_INHERITANCE_hasPrevious(self.__externalRCRef())
+    }
+    public func next() -> Swift.Never {
+        return OBJECT_WITH_GENERIC_INHERITANCE_next(self.__externalRCRef())
+    }
+    public func nextIndex() -> Swift.Int32 {
+        return OBJECT_WITH_GENERIC_INHERITANCE_nextIndex(self.__externalRCRef())
+    }
+    public func previous() -> Swift.Never {
+        return OBJECT_WITH_GENERIC_INHERITANCE_previous(self.__externalRCRef())
+    }
+    public func previousIndex() -> Swift.Int32 {
+        return OBJECT_WITH_GENERIC_INHERITANCE_previousIndex(self.__externalRCRef())
+    }
 }
 open class SEALED: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
     public final class C: main.SEALED {
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/containing_not_exported_classifiers.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/containing_not_exported_classifiers.kt
deleted file mode 100644
index 40c2c57..0000000
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/containing_not_exported_classifiers.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-// KIND: STANDALONE
-// MODULE: main
-// FILE: main.kt
-
-class Foo<T> {
-    companion object
-}
-
-fun bar(value: Foo.Companion) = Unit
\ No newline at end of file
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift
deleted file mode 100644
index 8b13789..0000000
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/main/main.h b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/main/main.h
deleted file mode 100644
index 7de29e1..0000000
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/main/main.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#include <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-NS_ASSUME_NONNULL_END
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/main/main.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/main/main.kt
deleted file mode 100644
index 6181095..0000000
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/main/main.kt
+++ /dev/null
@@ -1 +0,0 @@
-@file:kotlin.Suppress("DEPRECATION_ERROR")
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/main/main.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/main/main.swift
deleted file mode 100644
index 83945e6..0000000
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/golden_result/main/main.swift
+++ /dev/null
@@ -1,8 +0,0 @@
-import KotlinRuntime
-import KotlinRuntimeSupport
-
-public func bar(
-    value: Swift.Never
-) -> Swift.Void {
-    fatalError()
-}
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.h b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.h
index 7de29e1..b8041d5 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.h
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.h
@@ -1,5 +1,20 @@
 #include <Foundation/Foundation.h>
+#include <stdint.h>
 
 NS_ASSUME_NONNULL_BEGIN
 
+void * kotlin_Enum_Companion_get();
+
+int32_t kotlin_Enum_compareTo__TypesOfArguments__ExportedKotlinPackages_kotlin_Enum__(void * self, void * other);
+
+_Bool kotlin_Enum_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable other);
+
+int32_t kotlin_Enum_hashCode(void * self);
+
+NSString * kotlin_Enum_name_get(void * self);
+
+int32_t kotlin_Enum_ordinal_get(void * self);
+
+NSString * kotlin_Enum_toString(void * self);
+
 NS_ASSUME_NONNULL_END
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.kt
index ce8bdf2..843ecfc 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.kt
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.kt
@@ -1,2 +1,57 @@
 @file:kotlin.Suppress("DEPRECATION_ERROR")
 @file:kotlin.native.internal.objc.BindClassToObjCName(kotlin.Enum::class, "22ExportedKotlinPackages6kotlinO12KotlinStdlibE4EnumC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(kotlin.Enum.Companion::class, "22ExportedKotlinPackages6kotlinO12KotlinStdlibE4EnumC9CompanionC")
+
+import kotlin.native.internal.ExportedBridge
+import kotlinx.cinterop.*
+import kotlinx.cinterop.internal.convertBlockPtrToKotlinFunction
+
+@ExportedBridge("kotlin_Enum_Companion_get")
+public fun kotlin_Enum_Companion_get(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.Enum.Companion
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("kotlin_Enum_compareTo__TypesOfArguments__ExportedKotlinPackages_kotlin_Enum__")
+public fun kotlin_Enum_compareTo__TypesOfArguments__ExportedKotlinPackages_kotlin_Enum__(self: kotlin.native.internal.NativePtr, other: kotlin.native.internal.NativePtr): Int {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.Enum<kotlin.Enum<*>>
+    val __other = kotlin.native.internal.ref.dereferenceExternalRCRef(other) as kotlin.Enum<kotlin.Enum<*>>
+    val _result = __self.compareTo(__other)
+    return _result
+}
+
+@ExportedBridge("kotlin_Enum_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___")
+public fun kotlin_Enum_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self: kotlin.native.internal.NativePtr, other: kotlin.native.internal.NativePtr): Boolean {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.Enum<kotlin.Enum<*>>
+    val __other = if (other == kotlin.native.internal.NativePtr.NULL) null else kotlin.native.internal.ref.dereferenceExternalRCRef(other) as kotlin.Any
+    val _result = __self.equals(__other)
+    return _result
+}
+
+@ExportedBridge("kotlin_Enum_hashCode")
+public fun kotlin_Enum_hashCode(self: kotlin.native.internal.NativePtr): Int {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.Enum<kotlin.Enum<*>>
+    val _result = __self.hashCode()
+    return _result
+}
+
+@ExportedBridge("kotlin_Enum_name_get")
+public fun kotlin_Enum_name_get(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.Enum<kotlin.Enum<*>>
+    val _result = __self.name
+    return _result.objcPtr()
+}
+
+@ExportedBridge("kotlin_Enum_ordinal_get")
+public fun kotlin_Enum_ordinal_get(self: kotlin.native.internal.NativePtr): Int {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.Enum<kotlin.Enum<*>>
+    val _result = __self.ordinal
+    return _result
+}
+
+@ExportedBridge("kotlin_Enum_toString")
+public fun kotlin_Enum_toString(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.Enum<kotlin.Enum<*>>
+    val _result = __self.toString()
+    return _result.objcPtr()
+}
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.swift
index 08f7d0a..8081c91 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.swift
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/KotlinStdlib/KotlinStdlib.swift
@@ -5,5 +5,89 @@
 
 public extension ExportedKotlinPackages.kotlin {
     open class Enum: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        public final class Companion: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public static var shared: ExportedKotlinPackages.kotlin.Enum.Companion {
+                get {
+                    return ExportedKotlinPackages.kotlin.Enum.Companion.__createClassWrapper(externalRCRef: kotlin_Enum_Companion_get())
+                }
+            }
+            private init() {
+                fatalError()
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+        }
+        public final var name: Swift.String {
+            get {
+                return kotlin_Enum_name_get(self.__externalRCRef())
+            }
+        }
+        public final var ordinal: Swift.Int32 {
+            get {
+                return kotlin_Enum_ordinal_get(self.__externalRCRef())
+            }
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+        package init(
+            name: Swift.String,
+            ordinal: Swift.Int32
+        ) {
+            fatalError()
+        }
+        public static func <(
+            this: ExportedKotlinPackages.kotlin.Enum,
+            other: ExportedKotlinPackages.kotlin.Enum
+        ) -> Swift.Bool {
+            this._compareTo(other: other) < 0
+        }
+        public static func <=(
+            this: ExportedKotlinPackages.kotlin.Enum,
+            other: ExportedKotlinPackages.kotlin.Enum
+        ) -> Swift.Bool {
+            this._compareTo(other: other) <= 0
+        }
+        public static func ==(
+            this: ExportedKotlinPackages.kotlin.Enum,
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            this.equals(other: other)
+        }
+        public static func >(
+            this: ExportedKotlinPackages.kotlin.Enum,
+            other: ExportedKotlinPackages.kotlin.Enum
+        ) -> Swift.Bool {
+            this._compareTo(other: other) > 0
+        }
+        public static func >=(
+            this: ExportedKotlinPackages.kotlin.Enum,
+            other: ExportedKotlinPackages.kotlin.Enum
+        ) -> Swift.Bool {
+            this._compareTo(other: other) >= 0
+        }
+        public final func _compareTo(
+            other: ExportedKotlinPackages.kotlin.Enum
+        ) -> Swift.Int32 {
+            return kotlin_Enum_compareTo__TypesOfArguments__ExportedKotlinPackages_kotlin_Enum__(self.__externalRCRef(), other.__externalRCRef())
+        }
+        public final func equals(
+            other: KotlinRuntime.KotlinBase?
+        ) -> Swift.Bool {
+            return kotlin_Enum_equals__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), other.map { it in it.__externalRCRef() } ?? nil)
+        }
+        public final func hashCode() -> Swift.Int32 {
+            return kotlin_Enum_hashCode(self.__externalRCRef())
+        }
+        open func toString() -> Swift.String {
+            return kotlin_Enum_toString(self.__externalRCRef())
+        }
     }
 }
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.h b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.h
index 44ed5d5..55e032c 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.h
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.h
@@ -17,4 +17,6 @@
 
 void * Enum_valueOf__TypesOfArguments__Swift_String__(NSString * value);
 
+void * __root___enumId__TypesOfArguments__ExportedKotlinPackages_kotlin_Enum__(void * e);
+
 NS_ASSUME_NONNULL_END
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.kt
index a04016a..06237ed 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.kt
@@ -51,3 +51,9 @@
     return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
 }
 
+@ExportedBridge("__root___enumId__TypesOfArguments__ExportedKotlinPackages_kotlin_Enum__")
+public fun __root___enumId__TypesOfArguments__ExportedKotlinPackages_kotlin_Enum__(e: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __e = kotlin.native.internal.ref.dereferenceExternalRCRef(e) as kotlin.Enum<kotlin.Enum<*>>
+    val _result = enumId(__e)
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.swift
index 25ddd27..b38fa23 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/enums/golden_result/main/main.swift
@@ -45,5 +45,5 @@
 public func enumId(
     e: ExportedKotlinPackages.kotlin.Enum
 ) -> ExportedKotlinPackages.kotlin.Enum {
-    fatalError()
+    return ExportedKotlinPackages.kotlin.Enum.__createClassWrapper(externalRCRef: __root___enumId__TypesOfArguments__ExportedKotlinPackages_kotlin_Enum__(e.__externalRCRef()))
 }
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift
index dee2530..6655872 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/ExportedKotlinPackages/ExportedKotlinPackages.swift
@@ -1,3 +1,7 @@
+public enum kotlin {
+    public enum collections {
+    }
+}
 public enum namespace1 {
     public enum local_functions {
     }
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/KotlinStdlib/KotlinStdlib.h b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/KotlinStdlib/KotlinStdlib.h
new file mode 100644
index 0000000..5824187
--- /dev/null
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/KotlinStdlib/KotlinStdlib.h
@@ -0,0 +1,10 @@
+#include <Foundation/Foundation.h>
+#include <stdint.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+_Bool kotlin_collections_Iterator_hasNext(void * self);
+
+void * _Nullable kotlin_collections_Iterator_next(void * self);
+
+NS_ASSUME_NONNULL_END
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/KotlinStdlib/KotlinStdlib.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/KotlinStdlib/KotlinStdlib.kt
new file mode 100644
index 0000000..614367e
--- /dev/null
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/KotlinStdlib/KotlinStdlib.kt
@@ -0,0 +1,20 @@
+@file:kotlin.Suppress("DEPRECATION_ERROR")
+@file:kotlin.native.internal.objc.BindClassToObjCName(kotlin.collections.Iterator::class, "_Iterator")
+
+import kotlin.native.internal.ExportedBridge
+import kotlinx.cinterop.*
+import kotlinx.cinterop.internal.convertBlockPtrToKotlinFunction
+
+@ExportedBridge("kotlin_collections_Iterator_hasNext")
+public fun kotlin_collections_Iterator_hasNext(self: kotlin.native.internal.NativePtr): Boolean {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.collections.Iterator<kotlin.Any?>
+    val _result = __self.hasNext()
+    return _result
+}
+
+@ExportedBridge("kotlin_collections_Iterator_next")
+public fun kotlin_collections_Iterator_next(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.collections.Iterator<kotlin.Any?>
+    val _result = __self.next()
+    return if (_result == null) kotlin.native.internal.NativePtr.NULL else kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/KotlinStdlib/KotlinStdlib.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/KotlinStdlib/KotlinStdlib.swift
new file mode 100644
index 0000000..85eb3c0
--- /dev/null
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/KotlinStdlib/KotlinStdlib.swift
@@ -0,0 +1,24 @@
+@_exported import ExportedKotlinPackages
+@_implementationOnly import KotlinBridges_KotlinStdlib
+import KotlinRuntime
+import KotlinRuntimeSupport
+
+public extension ExportedKotlinPackages.kotlin.collections.Iterator where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func hasNext() -> Swift.Bool {
+        return kotlin_collections_Iterator_hasNext(self.__externalRCRef())
+    }
+    public func next() -> KotlinRuntime.KotlinBase? {
+        return { switch kotlin_collections_Iterator_next(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: ExportedKotlinPackages.kotlin.collections.Iterator where Wrapped : ExportedKotlinPackages.kotlin.collections._Iterator {
+}
+public extension ExportedKotlinPackages.kotlin.collections {
+    public protocol Iterator: KotlinRuntime.KotlinBase {
+        func hasNext() -> Swift.Bool
+        func next() -> KotlinRuntime.KotlinBase?
+    }
+    @objc(_Iterator)
+    protocol _Iterator {
+    }
+}
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.h b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.h
index 4b4e5de..df37572 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.h
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.h
@@ -61,6 +61,12 @@
 
 int32_t namespace2_foo__TypesOfArguments__Swift_Int32__(int32_t arg1);
 
+void * operators_Foo_EmptyIterator_get();
+
+_Bool operators_Foo_EmptyIterator_hasNext(void * self);
+
+int32_t operators_Foo_EmptyIterator_next(void * self);
+
 int32_t operators_Foo_compareTo__TypesOfArguments__ExportedKotlinPackages_operators_Foo__(void * self, void * other);
 
 _Bool operators_Foo_contains__TypesOfArguments__ExportedKotlinPackages_operators_Foo__(void * self, void * other);
@@ -87,6 +93,8 @@
 
 void * operators_Foo_invoke(void * self);
 
+void * operators_Foo_iterator(void * self);
+
 void * operators_Foo_minus__TypesOfArguments__ExportedKotlinPackages_operators_Foo__(void * self, void * other);
 
 void operators_Foo_minusAssign__TypesOfArguments__ExportedKotlinPackages_operators_Foo__(void * self, void * other);
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.kt
index 911f6e7..6009b8f 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.kt
@@ -214,6 +214,26 @@
     return _result
 }
 
+@ExportedBridge("operators_Foo_EmptyIterator_get")
+public fun operators_Foo_EmptyIterator_get(): kotlin.native.internal.NativePtr {
+    val _result = operators.Foo.EmptyIterator
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("operators_Foo_EmptyIterator_hasNext")
+public fun operators_Foo_EmptyIterator_hasNext(self: kotlin.native.internal.NativePtr): Boolean {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as operators.Foo.EmptyIterator
+    val _result = __self.hasNext()
+    return _result
+}
+
+@ExportedBridge("operators_Foo_EmptyIterator_next")
+public fun operators_Foo_EmptyIterator_next(self: kotlin.native.internal.NativePtr): Int {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as operators.Foo.EmptyIterator
+    val _result = __self.next()
+    return _result
+}
+
 @ExportedBridge("operators_Foo_compareTo__TypesOfArguments__ExportedKotlinPackages_operators_Foo__")
 public fun operators_Foo_compareTo__TypesOfArguments__ExportedKotlinPackages_operators_Foo__(self: kotlin.native.internal.NativePtr, other: kotlin.native.internal.NativePtr): Int {
     val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as operators.Foo
@@ -310,6 +330,13 @@
     return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
 }
 
+@ExportedBridge("operators_Foo_iterator")
+public fun operators_Foo_iterator(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as operators.Foo
+    val _result = __self.iterator()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
 @ExportedBridge("operators_Foo_minus__TypesOfArguments__ExportedKotlinPackages_operators_Foo__")
 public fun operators_Foo_minus__TypesOfArguments__ExportedKotlinPackages_operators_Foo__(self: kotlin.native.internal.NativePtr, other: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
     val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as operators.Foo
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.swift
index 53e009b..6ce9a8d 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/functions/golden_result/main/main.swift
@@ -2,6 +2,7 @@
 @_implementationOnly import KotlinBridges_main
 import KotlinRuntime
 import KotlinRuntimeSupport
+import KotlinStdlib
 
 public final class Foo: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
     public init() {
@@ -171,6 +172,26 @@
 public extension ExportedKotlinPackages.operators {
     public final class Foo: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
         public final class EmptyIterator: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+            public static var shared: ExportedKotlinPackages.operators.Foo.EmptyIterator {
+                get {
+                    return ExportedKotlinPackages.operators.Foo.EmptyIterator.__createClassWrapper(externalRCRef: operators_Foo_EmptyIterator_get())
+                }
+            }
+            private init() {
+                fatalError()
+            }
+            package override init(
+                __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+                options: KotlinRuntime.KotlinBaseConstructionOptions
+            ) {
+                super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+            }
+            public func hasNext() -> Swift.Bool {
+                return operators_Foo_EmptyIterator_hasNext(self.__externalRCRef())
+            }
+            public func next() -> Swift.Int32 {
+                return operators_Foo_EmptyIterator_next(self.__externalRCRef())
+            }
         }
         public var value: Swift.Int32 {
             get {
@@ -401,8 +422,8 @@
         public func inc() -> ExportedKotlinPackages.operators.Foo {
             return ExportedKotlinPackages.operators.Foo.__createClassWrapper(externalRCRef: operators_Foo_inc(self.__externalRCRef()))
         }
-        public func iterator() -> Swift.Never {
-            fatalError()
+        public func iterator() -> any ExportedKotlinPackages.kotlin.collections.Iterator {
+            return KotlinRuntime.KotlinBase.__createProtocolWrapper(externalRCRef: operators_Foo_iterator(self.__externalRCRef())) as! any ExportedKotlinPackages.kotlin.collections.Iterator
         }
         public func rangeTo(
             other: ExportedKotlinPackages.operators.Foo
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/generics.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/generics.kt
index 814c9cd..b48f42b 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/generics.kt
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/generics.kt
@@ -15,7 +15,7 @@
 }
 
 // An example producer class
-class StringProducer : Producer<String> {
+open class StringProducer : Producer<String> {
     override fun produce(): String = "Hello"
 }
 
@@ -42,4 +42,28 @@
 
 fun <T> List<T>.customFilter(predicate: (T) -> Boolean): List<T> {
     return this.filter(predicate)
-}
\ No newline at end of file
+}
+
+interface ConsumerProducer<T> : Consumer<T>, Producer<T>
+
+class CPImpl: StringProducer(), ConsumerProducer<String> {
+    override fun consume(item: String) {
+        println("Consumed: $item")
+    }
+}
+
+interface A <T> {
+    val foo: T
+}
+
+interface B <T> {
+    val foo: T
+}
+
+class Demo: A<Int>, B<Int?> {
+    override val foo = 5
+}
+
+abstract class Box<T>(val t: T)
+class DefaultBox<T>(t: T): Box<T>(t)
+class TripleBox: Box<Box<Box<Int>>>(DefaultBox(DefaultBox(5)))
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.h b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.h
index 0fec48b..c2bf7bb 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.h
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.h
@@ -3,6 +3,66 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
+void * _Nullable A_foo_get(void * self);
+
+void AnyConsumer_consume__TypesOfArguments__KotlinRuntime_KotlinBase__(void * self, void * item);
+
+void * _Nullable B_foo_get(void * self);
+
+void * _Nullable Box_t_get(void * self);
+
+void CPImpl_consume__TypesOfArguments__Swift_String__(void * self, NSString * item);
+
+void Consumer_consume__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable item);
+
+int32_t Demo_foo_get(void * self);
+
+void * _Nullable IdentityProcessor_process__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable input);
+
+void * _Nullable Pair_first_get(void * self);
+
+void * _Nullable Pair_second_get(void * self);
+
+void * _Nullable Processor_process__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(void * self, void * _Nullable input);
+
+void * _Nullable Producer_produce(void * self);
+
+NSString * StringProducer_produce(void * self);
+
+void * __root___AnyConsumer_init_allocate();
+
+void __root___AnyConsumer_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
+
+void * __root___CPImpl_init_allocate();
+
+void __root___CPImpl_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
+
+void * __root___DefaultBox_init_allocate();
+
+void __root___DefaultBox_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_KotlinRuntime_KotlinBase___(void * __kt, void * _Nullable t);
+
+void * __root___Demo_init_allocate();
+
+void __root___Demo_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
+
+void * __root___IdentityProcessor_init_allocate();
+
+void __root___IdentityProcessor_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
+
+void * __root___Pair_init_allocate();
+
+void __root___Pair_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase___(void * __kt, void * _Nullable first, void * _Nullable second);
+
+void * __root___StringProducer_init_allocate();
+
+void __root___StringProducer_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
+
+void * __root___TripleBox_init_allocate();
+
+void __root___TripleBox_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
+
+NSDictionary<id, id> * __root___createMap__TypesOfArguments__Swift_Array_main_Pair___(NSArray<id> * pairs);
+
 NSArray<id> * __root___customFilter__TypesOfArguments__Swift_Array_Swift_Optional_KotlinRuntime_KotlinBase___U28Swift_Optional_KotlinRuntime_KotlinBase_U29202D_U20Swift_Bool__(NSArray<id> * receiver, _Bool (^predicate)(void * _Nullable ));
 
 void __root___foo__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase___(void * _Nullable param1, void * _Nullable param2);
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.kt
index be3aec2..5641a0d 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.kt
@@ -1,12 +1,223 @@
 @file:kotlin.Suppress("DEPRECATION_ERROR")
 @file:kotlin.native.internal.objc.BindClassToObjCName(AnyConsumer::class, "4main11AnyConsumerC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Box::class, "4main3BoxC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(CPImpl::class, "4main6CPImplC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(DefaultBox::class, "4main10DefaultBoxC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Demo::class, "4main4DemoC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(IdentityProcessor::class, "4main17IdentityProcessorC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Pair::class, "4main4PairC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(StringProducer::class, "4main14StringProducerC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(TripleBox::class, "4main9TripleBoxC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(A::class, "_A")
+@file:kotlin.native.internal.objc.BindClassToObjCName(B::class, "_B")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Consumer::class, "_Consumer")
+@file:kotlin.native.internal.objc.BindClassToObjCName(ConsumerProducer::class, "_ConsumerProducer")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Processor::class, "_Processor")
+@file:kotlin.native.internal.objc.BindClassToObjCName(Producer::class, "_Producer")
 
 import kotlin.native.internal.ExportedBridge
 import kotlinx.cinterop.*
 import kotlinx.cinterop.internal.convertBlockPtrToKotlinFunction
 
+@ExportedBridge("A_foo_get")
+public fun A_foo_get(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as A<kotlin.Any?>
+    val _result = __self.foo
+    return if (_result == null) kotlin.native.internal.NativePtr.NULL else kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("AnyConsumer_consume__TypesOfArguments__KotlinRuntime_KotlinBase__")
+public fun AnyConsumer_consume__TypesOfArguments__KotlinRuntime_KotlinBase__(self: kotlin.native.internal.NativePtr, item: kotlin.native.internal.NativePtr): Unit {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as AnyConsumer
+    val __item = kotlin.native.internal.ref.dereferenceExternalRCRef(item) as kotlin.Any
+    __self.consume(__item)
+}
+
+@ExportedBridge("B_foo_get")
+public fun B_foo_get(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as B<kotlin.Any?>
+    val _result = __self.foo
+    return if (_result == null) kotlin.native.internal.NativePtr.NULL else kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("Box_t_get")
+public fun Box_t_get(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as Box<kotlin.Any?>
+    val _result = __self.t
+    return if (_result == null) kotlin.native.internal.NativePtr.NULL else kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("CPImpl_consume__TypesOfArguments__Swift_String__")
+public fun CPImpl_consume__TypesOfArguments__Swift_String__(self: kotlin.native.internal.NativePtr, item: kotlin.native.internal.NativePtr): Unit {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as CPImpl
+    val __item = interpretObjCPointer<kotlin.String>(item)
+    __self.consume(__item)
+}
+
+@ExportedBridge("Consumer_consume__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___")
+public fun Consumer_consume__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self: kotlin.native.internal.NativePtr, item: kotlin.native.internal.NativePtr): Unit {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as Consumer<kotlin.Any?>
+    val __item = if (item == kotlin.native.internal.NativePtr.NULL) null else kotlin.native.internal.ref.dereferenceExternalRCRef(item) as kotlin.Any
+    __self.consume(__item)
+}
+
+@ExportedBridge("Demo_foo_get")
+public fun Demo_foo_get(self: kotlin.native.internal.NativePtr): Int {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as Demo
+    val _result = __self.foo
+    return _result
+}
+
+@ExportedBridge("IdentityProcessor_process__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___")
+public fun IdentityProcessor_process__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self: kotlin.native.internal.NativePtr, input: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as IdentityProcessor<kotlin.Any?>
+    val __input = if (input == kotlin.native.internal.NativePtr.NULL) null else kotlin.native.internal.ref.dereferenceExternalRCRef(input) as kotlin.Any
+    val _result = __self.process(__input)
+    return if (_result == null) kotlin.native.internal.NativePtr.NULL else kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("Pair_first_get")
+public fun Pair_first_get(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as Pair<kotlin.Any?, kotlin.Any?>
+    val _result = __self.first
+    return if (_result == null) kotlin.native.internal.NativePtr.NULL else kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("Pair_second_get")
+public fun Pair_second_get(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as Pair<kotlin.Any?, kotlin.Any?>
+    val _result = __self.second
+    return if (_result == null) kotlin.native.internal.NativePtr.NULL else kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("Processor_process__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___")
+public fun Processor_process__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self: kotlin.native.internal.NativePtr, input: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as Processor<kotlin.Any?, kotlin.Any?>
+    val __input = if (input == kotlin.native.internal.NativePtr.NULL) null else kotlin.native.internal.ref.dereferenceExternalRCRef(input) as kotlin.Any
+    val _result = __self.process(__input)
+    return if (_result == null) kotlin.native.internal.NativePtr.NULL else kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("Producer_produce")
+public fun Producer_produce(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as Producer<kotlin.Any?>
+    val _result = __self.produce()
+    return if (_result == null) kotlin.native.internal.NativePtr.NULL else kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("StringProducer_produce")
+public fun StringProducer_produce(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as StringProducer
+    val _result = __self.produce()
+    return _result.objcPtr()
+}
+
+@ExportedBridge("__root___AnyConsumer_init_allocate")
+public fun __root___AnyConsumer_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<AnyConsumer>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___AnyConsumer_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__")
+public fun __root___AnyConsumer_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    kotlin.native.internal.initInstance(____kt, AnyConsumer())
+}
+
+@ExportedBridge("__root___CPImpl_init_allocate")
+public fun __root___CPImpl_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<CPImpl>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___CPImpl_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__")
+public fun __root___CPImpl_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    kotlin.native.internal.initInstance(____kt, CPImpl())
+}
+
+@ExportedBridge("__root___DefaultBox_init_allocate")
+public fun __root___DefaultBox_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<DefaultBox<kotlin.Any?>>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___DefaultBox_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_KotlinRuntime_KotlinBase___")
+public fun __root___DefaultBox_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_KotlinRuntime_KotlinBase___(__kt: kotlin.native.internal.NativePtr, t: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    val __t = if (t == kotlin.native.internal.NativePtr.NULL) null else kotlin.native.internal.ref.dereferenceExternalRCRef(t) as kotlin.Any
+    kotlin.native.internal.initInstance(____kt, DefaultBox<kotlin.Any?>(__t))
+}
+
+@ExportedBridge("__root___Demo_init_allocate")
+public fun __root___Demo_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<Demo>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___Demo_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__")
+public fun __root___Demo_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    kotlin.native.internal.initInstance(____kt, Demo())
+}
+
+@ExportedBridge("__root___IdentityProcessor_init_allocate")
+public fun __root___IdentityProcessor_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<IdentityProcessor<kotlin.Any?>>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___IdentityProcessor_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__")
+public fun __root___IdentityProcessor_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    kotlin.native.internal.initInstance(____kt, IdentityProcessor<kotlin.Any?>())
+}
+
+@ExportedBridge("__root___Pair_init_allocate")
+public fun __root___Pair_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<Pair<kotlin.Any?, kotlin.Any?>>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___Pair_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase___")
+public fun __root___Pair_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase___(__kt: kotlin.native.internal.NativePtr, first: kotlin.native.internal.NativePtr, second: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    val __first = if (first == kotlin.native.internal.NativePtr.NULL) null else kotlin.native.internal.ref.dereferenceExternalRCRef(first) as kotlin.Any
+    val __second = if (second == kotlin.native.internal.NativePtr.NULL) null else kotlin.native.internal.ref.dereferenceExternalRCRef(second) as kotlin.Any
+    kotlin.native.internal.initInstance(____kt, Pair<kotlin.Any?, kotlin.Any?>(__first, __second))
+}
+
+@ExportedBridge("__root___StringProducer_init_allocate")
+public fun __root___StringProducer_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<StringProducer>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___StringProducer_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__")
+public fun __root___StringProducer_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    kotlin.native.internal.initInstance(____kt, StringProducer())
+}
+
+@ExportedBridge("__root___TripleBox_init_allocate")
+public fun __root___TripleBox_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<TripleBox>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___TripleBox_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__")
+public fun __root___TripleBox_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    kotlin.native.internal.initInstance(____kt, TripleBox())
+}
+
+@ExportedBridge("__root___createMap__TypesOfArguments__Swift_Array_main_Pair___")
+public fun __root___createMap__TypesOfArguments__Swift_Array_main_Pair___(pairs: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __pairs = interpretObjCPointer<kotlin.collections.List<Pair<kotlin.Any?, kotlin.Any?>>>(pairs)
+    val _result = createMap(__pairs)
+    return _result.objcPtr()
+}
+
 @ExportedBridge("__root___customFilter__TypesOfArguments__Swift_Array_Swift_Optional_KotlinRuntime_KotlinBase___U28Swift_Optional_KotlinRuntime_KotlinBase_U29202D_U20Swift_Bool__")
 public fun __root___customFilter__TypesOfArguments__Swift_Array_Swift_Optional_KotlinRuntime_KotlinBase___U28Swift_Optional_KotlinRuntime_KotlinBase_U29202D_U20Swift_Bool__(`receiver`: kotlin.native.internal.NativePtr, predicate: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
     val __receiver = interpretObjCPointer<kotlin.collections.List<kotlin.Any?>>(`receiver`)
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.swift
index ad376bb..d13c0bb 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/generics/golden_result/main/main.swift
@@ -2,16 +2,221 @@
 import KotlinRuntime
 import KotlinRuntimeSupport
 
+public protocol A: KotlinRuntime.KotlinBase {
+    var foo: KotlinRuntime.KotlinBase? {
+        get
+    }
+}
+public protocol B: KotlinRuntime.KotlinBase {
+    var foo: KotlinRuntime.KotlinBase? {
+        get
+    }
+}
+public protocol Consumer: KotlinRuntime.KotlinBase {
+    func consume(
+        item: KotlinRuntime.KotlinBase?
+    ) -> Swift.Void
+}
+public protocol ConsumerProducer: KotlinRuntime.KotlinBase, main.Consumer, main.Producer {
+}
+public protocol Processor: KotlinRuntime.KotlinBase {
+    func process(
+        input: KotlinRuntime.KotlinBase?
+    ) -> KotlinRuntime.KotlinBase?
+}
+public protocol Producer: KotlinRuntime.KotlinBase {
+    func produce() -> KotlinRuntime.KotlinBase?
+}
+@objc(_A)
+protocol _A {
+}
+@objc(_B)
+protocol _B {
+}
+@objc(_Consumer)
+protocol _Consumer {
+}
+@objc(_ConsumerProducer)
+protocol _ConsumerProducer: main._Consumer, main._Producer {
+}
+@objc(_Processor)
+protocol _Processor {
+}
+@objc(_Producer)
+protocol _Producer {
+}
 public final class AnyConsumer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    public init() {
+        if Self.self != main.AnyConsumer.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.AnyConsumer ") }
+        let __kt = __root___AnyConsumer_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___AnyConsumer_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt)
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
+    public func consume(
+        item: KotlinRuntime.KotlinBase
+    ) -> Swift.Void {
+        return AnyConsumer_consume__TypesOfArguments__KotlinRuntime_KotlinBase__(self.__externalRCRef(), item.__externalRCRef())
+    }
+}
+open class Box: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    public final var t: KotlinRuntime.KotlinBase? {
+        get {
+            return { switch Box_t_get(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+    }
+    package init(
+        t: KotlinRuntime.KotlinBase?
+    ) {
+        fatalError()
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
+}
+public final class CPImpl: main.StringProducer {
+    public override init() {
+        if Self.self != main.CPImpl.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.CPImpl ") }
+        let __kt = __root___CPImpl_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___CPImpl_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt)
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
+    public func consume(
+        item: Swift.String
+    ) -> Swift.Void {
+        return CPImpl_consume__TypesOfArguments__Swift_String__(self.__externalRCRef(), item)
+    }
+}
+public final class DefaultBox: main.Box {
+    public override init(
+        t: KotlinRuntime.KotlinBase?
+    ) {
+        if Self.self != main.DefaultBox.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.DefaultBox ") }
+        let __kt = __root___DefaultBox_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___DefaultBox_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_KotlinRuntime_KotlinBase___(__kt, t.map { it in it.__externalRCRef() } ?? nil)
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
+}
+public final class Demo: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    public var foo: Swift.Int32 {
+        get {
+            return Demo_foo_get(self.__externalRCRef())
+        }
+    }
+    public init() {
+        if Self.self != main.Demo.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.Demo ") }
+        let __kt = __root___Demo_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___Demo_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt)
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
 }
 public final class IdentityProcessor: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    public init() {
+        if Self.self != main.IdentityProcessor.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.IdentityProcessor ") }
+        let __kt = __root___IdentityProcessor_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___IdentityProcessor_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt)
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
+    public func process(
+        input: KotlinRuntime.KotlinBase?
+    ) -> KotlinRuntime.KotlinBase? {
+        return { switch IdentityProcessor_process__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), input.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+    }
 }
-public final class StringProducer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+public final class Pair: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    public var first: KotlinRuntime.KotlinBase? {
+        get {
+            return { switch Pair_first_get(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+    }
+    public var second: KotlinRuntime.KotlinBase? {
+        get {
+            return { switch Pair_second_get(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
+    public init(
+        first: KotlinRuntime.KotlinBase?,
+        second: KotlinRuntime.KotlinBase?
+    ) {
+        if Self.self != main.Pair.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.Pair ") }
+        let __kt = __root___Pair_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___Pair_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase___(__kt, first.map { it in it.__externalRCRef() } ?? nil, second.map { it in it.__externalRCRef() } ?? nil)
+    }
+}
+open class StringProducer: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    public init() {
+        if Self.self != main.StringProducer.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.StringProducer ") }
+        let __kt = __root___StringProducer_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___StringProducer_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt)
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
+    open func produce() -> Swift.String {
+        return StringProducer_produce(self.__externalRCRef())
+    }
+}
+public final class TripleBox: main.Box {
+    public init() {
+        if Self.self != main.TripleBox.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.TripleBox ") }
+        let __kt = __root___TripleBox_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___TripleBox_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt)
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
 }
 public func createMap(
-    pairs: [Swift.Never]
+    pairs: [main.Pair]
 ) -> [KotlinRuntime.KotlinBase?: KotlinRuntime.KotlinBase?] {
-    fatalError()
+    return __root___createMap__TypesOfArguments__Swift_Array_main_Pair___(pairs) as! Swift.Dictionary<Swift.Optional<KotlinRuntime.KotlinBase>,Swift.Optional<KotlinRuntime.KotlinBase>>
 }
 public func customFilter(
     _ receiver: [KotlinRuntime.KotlinBase?],
@@ -28,3 +233,50 @@
 ) -> Swift.Void {
     return __root___foo__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase__Swift_Optional_KotlinRuntime_KotlinBase___(param1.map { it in it.__externalRCRef() } ?? nil, param2.map { it in it.__externalRCRef() } ?? nil)
 }
+public extension main.A where Self : KotlinRuntimeSupport._KotlinBridged {
+    public var foo: KotlinRuntime.KotlinBase? {
+        get {
+            return { switch A_foo_get(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+    }
+}
+public extension main.B where Self : KotlinRuntimeSupport._KotlinBridged {
+    public var foo: KotlinRuntime.KotlinBase? {
+        get {
+            return { switch B_foo_get(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+        }
+    }
+}
+public extension main.Consumer where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func consume(
+        item: KotlinRuntime.KotlinBase?
+    ) -> Swift.Void {
+        return Consumer_consume__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), item.map { it in it.__externalRCRef() } ?? nil)
+    }
+}
+public extension main.ConsumerProducer where Self : KotlinRuntimeSupport._KotlinBridged {
+}
+public extension main.Processor where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func process(
+        input: KotlinRuntime.KotlinBase?
+    ) -> KotlinRuntime.KotlinBase? {
+        return { switch Processor_process__TypesOfArguments__Swift_Optional_KotlinRuntime_KotlinBase___(self.__externalRCRef(), input.map { it in it.__externalRCRef() } ?? nil) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+    }
+}
+public extension main.Producer where Self : KotlinRuntimeSupport._KotlinBridged {
+    public func produce() -> KotlinRuntime.KotlinBase? {
+        return { switch Producer_produce(self.__externalRCRef()) { case nil: .none; case let res: KotlinRuntime.KotlinBase.__createClassWrapper(externalRCRef: res); } }()
+    }
+}
+extension KotlinRuntimeSupport._KotlinExistential: main.Producer where Wrapped : main._Producer {
+}
+extension KotlinRuntimeSupport._KotlinExistential: main.Consumer where Wrapped : main._Consumer {
+}
+extension KotlinRuntimeSupport._KotlinExistential: main.Processor where Wrapped : main._Processor {
+}
+extension KotlinRuntimeSupport._KotlinExistential: main.ConsumerProducer where Wrapped : main._ConsumerProducer {
+}
+extension KotlinRuntimeSupport._KotlinExistential: main.A where Wrapped : main._A {
+}
+extension KotlinRuntimeSupport._KotlinExistential: main.B where Wrapped : main._B {
+}
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.h b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.h
index 1115551..2adf644 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.h
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.h
@@ -5,12 +5,16 @@
 
 int8_t kotlin_ByteArray_get__TypesOfArguments__Swift_Int32__(void * self, int32_t index);
 
+void * kotlin_ByteArray_iterator(void * self);
+
 void kotlin_ByteArray_set__TypesOfArguments__Swift_Int32_Swift_Int8__(void * self, int32_t index, int8_t value);
 
 int32_t kotlin_ByteArray_size_get(void * self);
 
 uint16_t kotlin_CharArray_get__TypesOfArguments__Swift_Int32__(void * self, int32_t index);
 
+void * kotlin_CharArray_iterator(void * self);
+
 void kotlin_CharArray_set__TypesOfArguments__Swift_Int32_Swift_Unicode_UTF16_CodeUnit__(void * self, int32_t index, uint16_t value);
 
 int32_t kotlin_CharArray_size_get(void * self);
@@ -21,6 +25,14 @@
 
 void * kotlin_CharSequence_subSequence__TypesOfArguments__Swift_Int32_Swift_Int32__(void * self, int32_t startIndex, int32_t endIndex);
 
+int8_t kotlin_collections_ByteIterator_next(void * self);
+
+int8_t kotlin_collections_ByteIterator_nextByte(void * self);
+
+uint16_t kotlin_collections_CharIterator_next(void * self);
+
+uint16_t kotlin_collections_CharIterator_nextChar(void * self);
+
 void * kotlin_text_Appendable_append__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(void * self, uint16_t value);
 
 void * kotlin_text_Appendable_append__TypesOfArguments__Swift_Optional_anyU20ExportedKotlinPackages_kotlin_CharSequence___(void * self, void * _Nullable value);
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.kt
index 33eb5a6..814d4bd 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.kt
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.kt
@@ -19,6 +19,13 @@
     return _result
 }
 
+@ExportedBridge("kotlin_ByteArray_iterator")
+public fun kotlin_ByteArray_iterator(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.ByteArray
+    val _result = __self.iterator()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
 @ExportedBridge("kotlin_ByteArray_set__TypesOfArguments__Swift_Int32_Swift_Int8__")
 public fun kotlin_ByteArray_set__TypesOfArguments__Swift_Int32_Swift_Int8__(self: kotlin.native.internal.NativePtr, index: Int, value: Byte): Unit {
     val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.ByteArray
@@ -42,6 +49,13 @@
     return _result
 }
 
+@ExportedBridge("kotlin_CharArray_iterator")
+public fun kotlin_CharArray_iterator(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.CharArray
+    val _result = __self.iterator()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
 @ExportedBridge("kotlin_CharArray_set__TypesOfArguments__Swift_Int32_Swift_Unicode_UTF16_CodeUnit__")
 public fun kotlin_CharArray_set__TypesOfArguments__Swift_Int32_Swift_Unicode_UTF16_CodeUnit__(self: kotlin.native.internal.NativePtr, index: Int, value: Char): Unit {
     val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.CharArray
@@ -81,6 +95,34 @@
     return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
 }
 
+@ExportedBridge("kotlin_collections_ByteIterator_next")
+public fun kotlin_collections_ByteIterator_next(self: kotlin.native.internal.NativePtr): Byte {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.collections.ByteIterator
+    val _result = __self.next()
+    return _result
+}
+
+@ExportedBridge("kotlin_collections_ByteIterator_nextByte")
+public fun kotlin_collections_ByteIterator_nextByte(self: kotlin.native.internal.NativePtr): Byte {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.collections.ByteIterator
+    val _result = __self.nextByte()
+    return _result
+}
+
+@ExportedBridge("kotlin_collections_CharIterator_next")
+public fun kotlin_collections_CharIterator_next(self: kotlin.native.internal.NativePtr): Char {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.collections.CharIterator
+    val _result = __self.next()
+    return _result
+}
+
+@ExportedBridge("kotlin_collections_CharIterator_nextChar")
+public fun kotlin_collections_CharIterator_nextChar(self: kotlin.native.internal.NativePtr): Char {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.collections.CharIterator
+    val _result = __self.nextChar()
+    return _result
+}
+
 @ExportedBridge("kotlin_text_Appendable_append__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__")
 public fun kotlin_text_Appendable_append__TypesOfArguments__Swift_Unicode_UTF16_CodeUnit__(self: kotlin.native.internal.NativePtr, value: Char): kotlin.native.internal.NativePtr {
     val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.text.Appendable
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.swift
index 455b38a..c67fd44 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.swift
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/stdlibTypes/golden_result/KotlinStdlib/KotlinStdlib.swift
@@ -53,8 +53,38 @@
 }
 public extension ExportedKotlinPackages.kotlin.collections {
     open class ByteIterator: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        package init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+        public final func next() -> Swift.Int8 {
+            return kotlin_collections_ByteIterator_next(self.__externalRCRef())
+        }
+        open func nextByte() -> Swift.Int8 {
+            return kotlin_collections_ByteIterator_nextByte(self.__externalRCRef())
+        }
     }
     open class CharIterator: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        package init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+        public final func next() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_collections_CharIterator_next(self.__externalRCRef())
+        }
+        open func nextChar() -> Swift.Unicode.UTF16.CodeUnit {
+            return kotlin_collections_CharIterator_nextChar(self.__externalRCRef())
+        }
     }
 }
 public extension ExportedKotlinPackages.kotlin {
@@ -113,7 +143,7 @@
             return kotlin_ByteArray_set__TypesOfArguments__Swift_Int32_Swift_Int8__(self.__externalRCRef(), index, value)
         }
         public func iterator() -> ExportedKotlinPackages.kotlin.collections.ByteIterator {
-            fatalError()
+            return ExportedKotlinPackages.kotlin.collections.ByteIterator.__createClassWrapper(externalRCRef: kotlin_ByteArray_iterator(self.__externalRCRef()))
         }
         public subscript(
             index: Swift.Int32
@@ -161,7 +191,7 @@
             return kotlin_CharArray_set__TypesOfArguments__Swift_Int32_Swift_Unicode_UTF16_CodeUnit__(self.__externalRCRef(), index, value)
         }
         public func iterator() -> ExportedKotlinPackages.kotlin.collections.CharIterator {
-            fatalError()
+            return ExportedKotlinPackages.kotlin.collections.CharIterator.__createClassWrapper(externalRCRef: kotlin_CharArray_iterator(self.__externalRCRef()))
         }
         public subscript(
             index: Swift.Int32
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.h b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.h
index 00d7078..cc1e7cd 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.h
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.h
@@ -5,8 +5,14 @@
 
 int8_t kotlin_ByteArray_get__TypesOfArguments__Swift_Int32__(void * self, int32_t index);
 
+void * kotlin_ByteArray_iterator(void * self);
+
 void kotlin_ByteArray_set__TypesOfArguments__Swift_Int32_Swift_Int8__(void * self, int32_t index, int8_t value);
 
 int32_t kotlin_ByteArray_size_get(void * self);
 
+int8_t kotlin_collections_ByteIterator_next(void * self);
+
+int8_t kotlin_collections_ByteIterator_nextByte(void * self);
+
 NS_ASSUME_NONNULL_END
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.kt
index 5a619b2..6bd67dd 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.kt
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.kt
@@ -14,6 +14,13 @@
     return _result
 }
 
+@ExportedBridge("kotlin_ByteArray_iterator")
+public fun kotlin_ByteArray_iterator(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.ByteArray
+    val _result = __self.iterator()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
 @ExportedBridge("kotlin_ByteArray_set__TypesOfArguments__Swift_Int32_Swift_Int8__")
 public fun kotlin_ByteArray_set__TypesOfArguments__Swift_Int32_Swift_Int8__(self: kotlin.native.internal.NativePtr, index: Int, value: Byte): Unit {
     val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.ByteArray
@@ -28,3 +35,17 @@
     val _result = __self.size
     return _result
 }
+
+@ExportedBridge("kotlin_collections_ByteIterator_next")
+public fun kotlin_collections_ByteIterator_next(self: kotlin.native.internal.NativePtr): Byte {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.collections.ByteIterator
+    val _result = __self.next()
+    return _result
+}
+
+@ExportedBridge("kotlin_collections_ByteIterator_nextByte")
+public fun kotlin_collections_ByteIterator_nextByte(self: kotlin.native.internal.NativePtr): Byte {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as kotlin.collections.ByteIterator
+    val _result = __self.nextByte()
+    return _result
+}
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.swift
index 782efcd..2761159 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.swift
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/KotlinStdlib/KotlinStdlib.swift
@@ -5,6 +5,21 @@
 
 public extension ExportedKotlinPackages.kotlin.collections {
     open class ByteIterator: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+        package init() {
+            fatalError()
+        }
+        package override init(
+            __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+            options: KotlinRuntime.KotlinBaseConstructionOptions
+        ) {
+            super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+        }
+        public final func next() -> Swift.Int8 {
+            return kotlin_collections_ByteIterator_next(self.__externalRCRef())
+        }
+        open func nextByte() -> Swift.Int8 {
+            return kotlin_collections_ByteIterator_nextByte(self.__externalRCRef())
+        }
     }
 }
 public extension ExportedKotlinPackages.kotlin {
@@ -43,7 +58,7 @@
             return kotlin_ByteArray_set__TypesOfArguments__Swift_Int32_Swift_Int8__(self.__externalRCRef(), index, value)
         }
         public func iterator() -> ExportedKotlinPackages.kotlin.collections.ByteIterator {
-            fatalError()
+            return ExportedKotlinPackages.kotlin.collections.ByteIterator.__createClassWrapper(externalRCRef: kotlin_ByteArray_iterator(self.__externalRCRef()))
         }
         public subscript(
             index: Swift.Int32
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/state/state.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/state/state.kt
index 3a93a82..3d7990f 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/state/state.kt
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/transitiveExport/golden_result/state/state.kt
@@ -35,7 +35,7 @@
 
 @ExportedBridge("oh_my_state_inner_InnerState_init_allocate")
 public fun oh_my_state_inner_InnerState_init_allocate(): kotlin.native.internal.NativePtr {
-    val _result = kotlin.native.internal.createUninitializedInstance<oh.my.state.`inner`.InnerState>()
+    val _result = kotlin.native.internal.createUninitializedInstance<oh.my.state.inner.InnerState>()
     return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
 }
 
@@ -43,5 +43,5 @@
 public fun oh_my_state_inner_InnerState_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer_Swift_Optional_ExportedKotlinPackages_kotlin_ByteArray___(__kt: kotlin.native.internal.NativePtr, bytes: kotlin.native.internal.NativePtr): Unit {
     val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
     val __bytes = if (bytes == kotlin.native.internal.NativePtr.NULL) null else kotlin.native.internal.ref.dereferenceExternalRCRef(bytes) as kotlin.ByteArray
-    kotlin.native.internal.initInstance(____kt, oh.my.state.`inner`.InnerState(__bytes))
+    kotlin.native.internal.initInstance(____kt, oh.my.state.inner.InnerState(__bytes))
 }
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.h b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.h
index f33dc60..f599538 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.h
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.h
@@ -51,6 +51,18 @@
 
 void * ENUM_valueOf__TypesOfArguments__Swift_String__(NSString * value);
 
+_Bool OBJECT_WITH_GENERIC_INHERITANCE_hasNext(void * self);
+
+_Bool OBJECT_WITH_GENERIC_INHERITANCE_hasPrevious(void * self);
+
+void OBJECT_WITH_GENERIC_INHERITANCE_next(void * self) __attribute((noreturn));
+
+int32_t OBJECT_WITH_GENERIC_INHERITANCE_nextIndex(void * self);
+
+void OBJECT_WITH_GENERIC_INHERITANCE_previous(void * self) __attribute((noreturn));
+
+int32_t OBJECT_WITH_GENERIC_INHERITANCE_previousIndex(void * self);
+
 void * SEALED_O_get();
 
 void * __root___DATA_CLASS_WITH_REF_init_allocate();
@@ -63,12 +75,18 @@
 
 void * __root___DATA_OBJECT_WITH_PACKAGE_get();
 
+void * __root___GENERIC_CLASS_init_allocate();
+
+void __root___GENERIC_CLASS_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
+
 void * __root___INHERITANCE_SINGLE_CLASS_init_allocate();
 
 void __root___INHERITANCE_SINGLE_CLASS_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(void * __kt);
 
 void * __root___OBJECT_WITH_CLASS_INHERITANCE_get();
 
+void * __root___OBJECT_WITH_GENERIC_INHERITANCE_get();
+
 void * __root___OBJECT_WITH_INTERFACE_INHERITANCE_get();
 
 void * __root___OPEN_CLASS_init_allocate();
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.kt b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.kt
index 0ebb4b8..080cee4 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.kt
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.kt
@@ -7,6 +7,7 @@
 @file:kotlin.native.internal.objc.BindClassToObjCName(DATA_OBJECT_WITH_PACKAGE::class, "4main24DATA_OBJECT_WITH_PACKAGEC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(ENUM::class, "4main4ENUMC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(ENUM.INSIDE_ENUM::class, "4main4ENUMC11INSIDE_ENUMC")
+@file:kotlin.native.internal.objc.BindClassToObjCName(GENERIC_CLASS::class, "4main13GENERIC_CLASSC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(INHERITANCE_SINGLE_CLASS::class, "4main24INHERITANCE_SINGLE_CLASSC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(OBJECT_WITH_CLASS_INHERITANCE::class, "4main29OBJECT_WITH_CLASS_INHERITANCEC")
 @file:kotlin.native.internal.objc.BindClassToObjCName(OBJECT_WITH_GENERIC_INHERITANCE::class, "4main31OBJECT_WITH_GENERIC_INHERITANCEC")
@@ -187,6 +188,48 @@
     return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
 }
 
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_hasNext")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_hasNext(self: kotlin.native.internal.NativePtr): Boolean {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.hasNext()
+    return _result
+}
+
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_hasPrevious")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_hasPrevious(self: kotlin.native.internal.NativePtr): Boolean {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.hasPrevious()
+    return _result
+}
+
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_next")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_next(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.next()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_nextIndex")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_nextIndex(self: kotlin.native.internal.NativePtr): Int {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.nextIndex()
+    return _result
+}
+
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_previous")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_previous(self: kotlin.native.internal.NativePtr): kotlin.native.internal.NativePtr {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.previous()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("OBJECT_WITH_GENERIC_INHERITANCE_previousIndex")
+public fun OBJECT_WITH_GENERIC_INHERITANCE_previousIndex(self: kotlin.native.internal.NativePtr): Int {
+    val __self = kotlin.native.internal.ref.dereferenceExternalRCRef(self) as OBJECT_WITH_GENERIC_INHERITANCE
+    val _result = __self.previousIndex()
+    return _result
+}
+
 @ExportedBridge("SEALED_O_get")
 public fun SEALED_O_get(): kotlin.native.internal.NativePtr {
     val _result = SEALED.O
@@ -225,6 +268,18 @@
     return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
 }
 
+@ExportedBridge("__root___GENERIC_CLASS_init_allocate")
+public fun __root___GENERIC_CLASS_init_allocate(): kotlin.native.internal.NativePtr {
+    val _result = kotlin.native.internal.createUninitializedInstance<GENERIC_CLASS<kotlin.Any?>>()
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
+@ExportedBridge("__root___GENERIC_CLASS_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__")
+public fun __root___GENERIC_CLASS_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt: kotlin.native.internal.NativePtr): Unit {
+    val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
+    kotlin.native.internal.initInstance(____kt, GENERIC_CLASS<kotlin.Any?>())
+}
+
 @ExportedBridge("__root___INHERITANCE_SINGLE_CLASS_init_allocate")
 public fun __root___INHERITANCE_SINGLE_CLASS_init_allocate(): kotlin.native.internal.NativePtr {
     val _result = kotlin.native.internal.createUninitializedInstance<INHERITANCE_SINGLE_CLASS>()
@@ -243,6 +298,12 @@
     return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
 }
 
+@ExportedBridge("__root___OBJECT_WITH_GENERIC_INHERITANCE_get")
+public fun __root___OBJECT_WITH_GENERIC_INHERITANCE_get(): kotlin.native.internal.NativePtr {
+    val _result = OBJECT_WITH_GENERIC_INHERITANCE
+    return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
+}
+
 @ExportedBridge("__root___OBJECT_WITH_INTERFACE_INHERITANCE_get")
 public fun __root___OBJECT_WITH_INTERFACE_INHERITANCE_get(): kotlin.native.internal.NativePtr {
     val _result = OBJECT_WITH_INTERFACE_INHERITANCE
@@ -337,12 +398,12 @@
 
 @ExportedBridge("typealiases_inner_Bar_init_allocate")
 public fun typealiases_inner_Bar_init_allocate(): kotlin.native.internal.NativePtr {
-    val _result = kotlin.native.internal.createUninitializedInstance<typealiases.`inner`.Bar>()
+    val _result = kotlin.native.internal.createUninitializedInstance<typealiases.inner.Bar>()
     return kotlin.native.internal.ref.createRetainedExternalRCRef(_result)
 }
 
 @ExportedBridge("typealiases_inner_Bar_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__")
 public fun typealiases_inner_Bar_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt: kotlin.native.internal.NativePtr): Unit {
     val ____kt = kotlin.native.internal.ref.dereferenceExternalRCRef(__kt)!!
-    kotlin.native.internal.initInstance(____kt, typealiases.`inner`.Bar())
+    kotlin.native.internal.initInstance(____kt, typealiases.inner.Bar())
 }
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.swift b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.swift
index d05e68f..95459a7 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.swift
+++ b/native/swift/swift-export-standalone-integration-tests/simple/testData/generation/typealiases/golden_result/main/main.swift
@@ -13,11 +13,13 @@
 public typealias dataObjectWithPackage = main.DATA_OBJECT_WITH_PACKAGE
 public typealias deeper_closure_typealias = main.closure
 public typealias enumClass = main.ENUM
+public typealias generic = main.GENERIC_CLASS
 public typealias inheritanceSingleClass = main.INHERITANCE_SINGLE_CLASS
 public typealias never = Swift.Never
 public typealias nullable_class = ExportedKotlinPackages.typealiases.Foo?
 public typealias nullable_primitive = Swift.Int32?
 public typealias objectWithClassInheritance = main.OBJECT_WITH_CLASS_INHERITANCE
+public typealias objectWithGenericInheritance = main.OBJECT_WITH_GENERIC_INHERITANCE
 public typealias objectWithInterfaceInheritance = main.OBJECT_WITH_INTERFACE_INHERITANCE
 public typealias openClass = main.OPEN_CLASS
 public typealias outerInterface = any main.OUTSIDE_PROTO
@@ -220,6 +222,20 @@
         return main.ENUM.__createClassWrapper(externalRCRef: ENUM_valueOf__TypesOfArguments__Swift_String__(value))
     }
 }
+public final class GENERIC_CLASS: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    public init() {
+        if Self.self != main.GENERIC_CLASS.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.GENERIC_CLASS ") }
+        let __kt = __root___GENERIC_CLASS_init_allocate()
+        super.init(__externalRCRefUnsafe: __kt, options: .asBoundBridge)
+        __root___GENERIC_CLASS_init_initialize__TypesOfArguments__Swift_UnsafeMutableRawPointer__(__kt)
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
+}
 public final class INHERITANCE_SINGLE_CLASS: main.OPEN_CLASS {
     public override init() {
         if Self.self != main.INHERITANCE_SINGLE_CLASS.self { fatalError("Inheritance from exported Kotlin classes is not supported yet: \(String(reflecting: Self.self)) inherits from main.INHERITANCE_SINGLE_CLASS ") }
@@ -251,6 +267,38 @@
     }
 }
 public final class OBJECT_WITH_GENERIC_INHERITANCE: KotlinRuntime.KotlinBase, KotlinRuntimeSupport._KotlinBridged {
+    public static var shared: main.OBJECT_WITH_GENERIC_INHERITANCE {
+        get {
+            return main.OBJECT_WITH_GENERIC_INHERITANCE.__createClassWrapper(externalRCRef: __root___OBJECT_WITH_GENERIC_INHERITANCE_get())
+        }
+    }
+    private init() {
+        fatalError()
+    }
+    package override init(
+        __externalRCRefUnsafe: Swift.UnsafeMutableRawPointer?,
+        options: KotlinRuntime.KotlinBaseConstructionOptions
+    ) {
+        super.init(__externalRCRefUnsafe: __externalRCRefUnsafe, options: options)
+    }
+    public func hasNext() -> Swift.Bool {
+        return OBJECT_WITH_GENERIC_INHERITANCE_hasNext(self.__externalRCRef())
+    }
+    public func hasPrevious() -> Swift.Bool {
+        return OBJECT_WITH_GENERIC_INHERITANCE_hasPrevious(self.__externalRCRef())
+    }
+    public func next() -> Swift.Never {
+        return OBJECT_WITH_GENERIC_INHERITANCE_next(self.__externalRCRef())
+    }
+    public func nextIndex() -> Swift.Int32 {
+        return OBJECT_WITH_GENERIC_INHERITANCE_nextIndex(self.__externalRCRef())
+    }
+    public func previous() -> Swift.Never {
+        return OBJECT_WITH_GENERIC_INHERITANCE_previous(self.__externalRCRef())
+    }
+    public func previousIndex() -> Swift.Int32 {
+        return OBJECT_WITH_GENERIC_INHERITANCE_previousIndex(self.__externalRCRef())
+    }
 }
 public final class OBJECT_WITH_INTERFACE_INHERITANCE: KotlinRuntime.KotlinBase, main.OUTSIDE_PROTO, main._OUTSIDE_PROTO, KotlinRuntimeSupport._KotlinBridged {
     public static var shared: main.OBJECT_WITH_INTERFACE_INHERITANCE {
diff --git a/native/swift/swift-export-standalone-integration-tests/simple/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/test/KlibBasedSwiftExportRunnerTest.java b/native/swift/swift-export-standalone-integration-tests/simple/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/test/KlibBasedSwiftExportRunnerTest.java
index 4002fca..e834701 100644
--- a/native/swift/swift-export-standalone-integration-tests/simple/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/test/KlibBasedSwiftExportRunnerTest.java
+++ b/native/swift/swift-export-standalone-integration-tests/simple/tests-gen/org/jetbrains/kotlin/swiftexport/standalone/test/KlibBasedSwiftExportRunnerTest.java
@@ -44,12 +44,6 @@
   }
 
   @Test
-  @TestMetadata("containing_not_exported_classifiers")
-  public void testContaining_not_exported_classifiers() {
-    runTest("native/swift/swift-export-standalone-integration-tests/simple/testData/generation/containing_not_exported_classifiers/");
-  }
-
-  @Test
   @TestMetadata("contextParameters")
   public void testContextParameters() {
     runTest("native/swift/swift-export-standalone-integration-tests/simple/testData/generation/contextParameters/");
diff --git a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/utils/StandaloneSirTypeNamer.kt b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/utils/StandaloneSirTypeNamer.kt
index 8f8be0c..57e942f 100644
--- a/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/utils/StandaloneSirTypeNamer.kt
+++ b/native/swift/swift-export-standalone/src/org/jetbrains/kotlin/swiftexport/standalone/utils/StandaloneSirTypeNamer.kt
@@ -5,9 +5,13 @@
 
 package org.jetbrains.kotlin.swiftexport.standalone.utils
 
+import org.jetbrains.kotlin.analysis.api.KaExperimentalApi
 import org.jetbrains.kotlin.analysis.api.symbols.KaClassLikeSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.typeParameters
+import org.jetbrains.kotlin.analysis.api.types.symbol
 import org.jetbrains.kotlin.sir.*
 import org.jetbrains.kotlin.sir.bridge.SirTypeNamer
+import org.jetbrains.kotlin.sir.bridge.SirTypeNamer.KotlinNameType
 import org.jetbrains.kotlin.sir.providers.source.kaSymbolOrNull
 import org.jetbrains.kotlin.sir.providers.utils.KotlinRuntimeModule
 import org.jetbrains.kotlin.sir.util.SirSwiftModule
@@ -16,16 +20,25 @@
 internal object StandaloneSirTypeNamer : SirTypeNamer {
     override fun swiftFqName(type: SirType): String = type.swiftName
 
-    override fun kotlinFqName(type: SirType): String = when (type) {
+    override fun kotlinFqName(sirType: SirType, nameType: KotlinNameType): String = when (nameType) {
+        KotlinNameType.FQN -> kotlinFqName(sirType)
+        KotlinNameType.PARAMETRIZED -> kotlinParametrizedName(sirType)
+    }
+
+    private fun kotlinFqName(type: SirType): String = when (type) {
         is SirNominalType -> kotlinFqName(type)
         is SirExistentialType -> kotlinFqName(type)
         is SirErrorType, is SirFunctionalType, is SirUnsupportedType -> error("Type $type can not be named")
     }
 
+    private fun kotlinParametrizedName(type: SirType): String =
+        (type as? SirNominalType)?.typeDeclaration?.kaSymbolOrNull<KaClassLikeSymbol>()?.parametrisedTypeName() ?: kotlinFqName(type)
+
     private fun kotlinFqName(type: SirExistentialType): String = type.protocols.single().let {
         it.kaSymbolOrNull<KaClassLikeSymbol>()!!.classId!!.asFqNameString()
     }
 
+    @OptIn(KaExperimentalApi::class)
     private fun kotlinFqName(type: SirNominalType): String {
         return when (val declaration = type.typeDeclaration) {
             KotlinRuntimeModule.kotlinBase -> "kotlin.Any"
@@ -53,9 +66,9 @@
             SirSwiftModule.void -> "Void"
             SirSwiftModule.never -> "Nothing"
 
-            SirSwiftModule.array -> "kotlin.collections.List<${kotlinFqName(type.typeArguments.first())}>"
-            SirSwiftModule.set -> "kotlin.collections.Set<${kotlinFqName(type.typeArguments.first())}>"
-            SirSwiftModule.dictionary -> "kotlin.collections.Map<${kotlinFqName(type.typeArguments[0])}, ${kotlinFqName(type.typeArguments[1])}>"
+            SirSwiftModule.array -> "kotlin.collections.List<${kotlinParametrizedName(type.typeArguments.first())}>"
+            SirSwiftModule.set -> "kotlin.collections.Set<${kotlinParametrizedName(type.typeArguments.first())}>"
+            SirSwiftModule.dictionary -> "kotlin.collections.Map<${kotlinParametrizedName(type.typeArguments[0])}, ${kotlinParametrizedName(type.typeArguments[1])}>"
 
             SirSwiftModule.optional -> kotlinFqName(type.typeArguments.first()) + "?"
 
@@ -63,4 +76,24 @@
                 ?: error("Unnameable declaration $declaration")
         }
     }
-}
\ No newline at end of file
+
+    @OptIn(KaExperimentalApi::class)
+    private fun KaClassLikeSymbol.parametrisedTypeName(): String? {
+        val fqname = classId?.asFqNameString()
+            ?: return null
+        if (typeParameters.isEmpty())
+            return fqname
+
+        val typesRendered = typeParameters.map { it.upperBounds.firstOrNull() }
+            .map {
+                when (it?.symbol?.classId?.asFqNameString()) {
+                    fqname -> classId?.asFqNameString() + "<${typeParameters.joinToString { "*" }}>"
+                    else -> it?.symbol?.parametrisedTypeName()
+                }
+            }
+            .map { it ?: "kotlin.Any?" }
+
+        return "$fqname<${typesRendered.joinToString()}>"
+    }
+
+}
