commit 6eb9be5fe54fa75d7f199a3ac1e720814a08f64e Author: Anthony Chomienne Date: Tue Jun 22 16:05:02 2021 +0200 Alpha version diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..603b140 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/.idea/$CACHE_FILE$ b/.idea/$CACHE_FILE$ new file mode 100644 index 0000000..1a3da10 --- /dev/null +++ b/.idea/$CACHE_FILE$ @@ -0,0 +1,65 @@ + + + + + + + + + + + AccessibilityLintAndroid + + + Android + + + Bidirectional TextInternationalizationLintAndroid + + + Chrome OSCorrectnessLintAndroid + + + Class structureJava + + + CorrectnessLintAndroid + + + IconsUsabilityLintAndroid + + + InternationalizationLintAndroid + + + Java + + + Javadoc issuesJava + + + LintAndroid + + + LintLintAndroid + + + MessagesCorrectnessLintAndroid + + + PerformanceLintAndroid + + + SecurityLintAndroid + + + TypographyUsabilityLintAndroid + + + UsabilityLintAndroid + + + + + + \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..53f5df5 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Peeriscope \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..a93e18f --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,139 @@ + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/dictionaries/schoumi.xml b/.idea/dictionaries/schoumi.xml new file mode 100644 index 0000000..e0cf863 --- /dev/null +++ b/.idea/dictionaries/schoumi.xml @@ -0,0 +1,8 @@ + + + + datas + rtmp + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..9dfffb9 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..2370474 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..98de6fa --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..e8d2226 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,59 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-parcelize' +apply plugin: 'kotlin-kapt' +apply plugin: 'androidx.navigation.safeargs.kotlin' + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "fr.mobdev.peertubelive" + minSdkVersion 19 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables + { + useSupportLibrary true + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } + + buildFeatures { + dataBinding true + } + +} + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation project(':rtplibrary') + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.core:core-ktx:1.3.2' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.3.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' + testImplementation 'junit:junit:4.13.1' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/release/app-release.apk b/app/release/app-release.apk new file mode 100644 index 0000000..bd8aea7 Binary files /dev/null and b/app/release/app-release.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..c9aea5a --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "org.framasoft.peertubelive", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-release.apk" + } + ] +} \ No newline at end of file diff --git a/app/release/peertube_live.aab b/app/release/peertube_live.aab new file mode 100644 index 0000000..2d850c5 Binary files /dev/null and b/app/release/peertube_live.aab differ diff --git a/app/src/androidTest/java/fr/mobdev/peertubelive/ExampleInstrumentedTest.kt b/app/src/androidTest/java/fr/mobdev/peertubelive/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..8c6a63c --- /dev/null +++ b/app/src/androidTest/java/fr/mobdev/peertubelive/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package org.framasoft.peertubelive + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("org.framasoft.peeriscope", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..00dd53d --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..5ce25b0 Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/fr/mobdev/peertubelive/activity/AccountAdapter.kt b/app/src/main/java/fr/mobdev/peertubelive/activity/AccountAdapter.kt new file mode 100644 index 0000000..a487807 --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/activity/AccountAdapter.kt @@ -0,0 +1,58 @@ +package fr.mobdev.peertubelive.activity + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import fr.mobdev.peertubelive.R +import fr.mobdev.peertubelive.databinding.InstanceItemBinding +import fr.mobdev.peertubelive.objects.OAuthData + +class AccountAdapter(private var accounts: List): RecyclerView.Adapter() { + + var onDeleteAccount: OnDeleteAccount? = null + var onClickListener: OnClickListener? = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val binding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), R.layout.instance_item, parent, false) + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val oauthData = accounts[position] + holder.binding.username.text = oauthData.username + holder.binding.url.text = oauthData.baseUrl + holder.pos = position + } + + override fun getItemCount(): Int { + return accounts.size + } + + fun setAccounts(accounts: List) { + this.accounts = accounts + notifyDataSetChanged() + } + + inner class ViewHolder(val binding: InstanceItemBinding) : RecyclerView.ViewHolder(binding.root) { + var pos: Int = 0 + init { + binding.root.setOnClickListener { + onClickListener?.onClick(accounts[pos]) + } + + binding.root.setOnLongClickListener { + onDeleteAccount?.onDeleteAccount(accounts[pos]) + return@setOnLongClickListener true + } + } + } + + interface OnDeleteAccount{ + fun onDeleteAccount(oAuthData: OAuthData) + } + + interface OnClickListener{ + fun onClick(oAuthData: OAuthData) + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/activity/CreateLiveActivity.kt b/app/src/main/java/fr/mobdev/peertubelive/activity/CreateLiveActivity.kt new file mode 100644 index 0000000..9bfd885 --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/activity/CreateLiveActivity.kt @@ -0,0 +1,373 @@ +package fr.mobdev.peertubelive.activity + +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.ArrayAdapter +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.DataBindingUtil +import fr.mobdev.peertubelive.R +import fr.mobdev.peertubelive.databinding.ChannelListBinding +import fr.mobdev.peertubelive.manager.DatabaseManager +import fr.mobdev.peertubelive.manager.InstanceManager +import fr.mobdev.peertubelive.objects.ChannelData +import fr.mobdev.peertubelive.objects.OAuthData +import fr.mobdev.peertubelive.objects.StreamData +import fr.mobdev.peertubelive.objects.StreamSettings +import fr.mobdev.peertubelive.utils.TranslationUtils +import java.util.ArrayList + +class CreateLiveActivity : AppCompatActivity() { + + companion object{ + const val OAUTH_DATA = "OAUTH_DATA" + } + + private lateinit var channels: List + private lateinit var categories: MutableMap + private lateinit var licences: MutableMap + private lateinit var privacies: MutableMap + private lateinit var languages: MutableMap + private lateinit var oAuthData: OAuthData + private var inError: Boolean = false + private var showAdvancedSettings = true + private lateinit var binding: ChannelListBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + oAuthData = intent.getParcelableExtra(OAUTH_DATA)!! + + binding = DataBindingUtil.setContentView(this,R.layout.channel_list) + + binding.error.visibility = View.GONE + binding.channelList.visibility = View.GONE + binding.liveTitle.visibility = View.GONE + binding.channel.visibility = View.GONE + binding.title.visibility = View.GONE + binding.titleError.visibility = View.GONE + binding.advanceSettings.visibility = View.GONE + binding.privacy.visibility = View.GONE + binding.privacyList.visibility = View.GONE + + toggleAdvanceSettings() + + binding.goLive.isEnabled = false + binding.advanceSettings.setOnClickListener{ + toggleAdvanceSettings() + } + binding.goLive.setOnClickListener { + val title = binding.liveTitle.text.toString() + val channel = channels[binding.channelList.selectedItemPosition].id + var category: Int? = categories[binding.categoryList.selectedItem.toString()]!! + val privacy = privacies[binding.privacyList.selectedItem.toString()]!! + if (category == 0) + category = null + var language: String? = languages[binding.languageList.selectedItem.toString()]!! + if (language != null && language.isEmpty()) + language = null + var licence: Int? = licences[binding.licenceList.selectedItem.toString()]!! + if (licence == 0) + licence = null + + var description: String? = binding.description.text.toString() + if (description != null && description.isEmpty()) + description = null + + val comments = binding.commentsEnabled.isChecked + val download = binding.downloadEnabled.isChecked + val nsfw = binding.nsfw.isChecked + val replay = binding.saveReplay.isChecked + + val streamSettings = StreamSettings(title,channel,privacy,category,language,licence,description,comments,download,nsfw,replay) + DatabaseManager.updateStreamSettings(this,streamSettings) + if(title.isEmpty()) + { + binding.titleError.visibility = View.VISIBLE + } else { + binding.titleError.visibility = View.GONE + goLive(streamSettings) + } + } + + InstanceManager.getCategoryList(this,oAuthData.baseUrl!!,object : InstanceManager.InstanceListener { + override fun onSuccess(args: Bundle?) { + val map = args?.getSerializable(InstanceManager.EXTRA_DATA)!! as Map + categories = HashMap(map.count()) + for(pair in map.entries) { + val stringId = TranslationUtils.getCategoryTranslationFor(pair.key) + if(stringId != -1) + categories[getString(stringId)] = pair.value + else + categories[pair.key] = pair.value + } + updateView(null) + } + + override fun onError(error: String?) { + inError = true + updateView(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + this@CreateLiveActivity.oAuthData.updateData(oauthData) + } + }) + + InstanceManager.getUserChannelList(this,oAuthData.baseUrl!!,oAuthData, object : InstanceManager.InstanceListener { + override fun onSuccess(args: Bundle?) { + channels = args?.getParcelableArrayList(InstanceManager.EXTRA_DATA)!! + updateView(null) + } + + override fun onError(error: String?) { + inError = true + updateView(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + this@CreateLiveActivity.oAuthData.updateData(oauthData) + } + }) + + InstanceManager.getPrivacyList(this,oAuthData.baseUrl!!, object : InstanceManager.InstanceListener { + override fun onSuccess(args: Bundle?) { + val map = args?.getSerializable(InstanceManager.EXTRA_DATA)!! as Map + privacies = HashMap(map.count()) + for(pair in map.entries) { + val stringId = TranslationUtils.getPrivacyTranslationFor(pair.key) + if(stringId != -1) + privacies[getString(stringId)] = pair.value + else + privacies[pair.key] = pair.value + } + updateView(null) + } + + override fun onError(error: String?) { + inError = true + updateView(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + this@CreateLiveActivity.oAuthData.updateData(oauthData) + } + }) + + InstanceManager.getLicencesList(this,oAuthData.baseUrl!!, object : InstanceManager.InstanceListener { + override fun onSuccess(args: Bundle?) { + var map = args?.getSerializable(InstanceManager.EXTRA_DATA)!! as Map + licences = HashMap(map.count()) + for(pair in map.entries) { + val stringId = TranslationUtils.getLicenceTranslationFor(pair.key) + if(stringId != -1) + licences[getString(stringId)] = pair.value + else + licences[pair.key] = pair.value + } + updateView(null) + } + + override fun onError(error: String?) { + inError = true + updateView(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + this@CreateLiveActivity.oAuthData.updateData(oauthData) + } + }) + + InstanceManager.getLanguageList(this,oAuthData.baseUrl!!, object : InstanceManager.InstanceListener { + override fun onSuccess(args: Bundle?) { + val map = args?.getSerializable(InstanceManager.EXTRA_DATA)!! as Map + languages = HashMap(map.count()) + for(pair in map.entries) { + val stringId = TranslationUtils.getLanguageTranslationFor(pair.key) + if(stringId != -1) + languages[getString(stringId)] = pair.value + else + languages[pair.key] = pair.value + } + updateView(null) + } + + override fun onError(error: String?) { + inError = true + updateView(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + this@CreateLiveActivity.oAuthData.updateData(oauthData) + } + }) + } + + private fun updateView(error: String?) { + if(!inError) { + if(this::channels.isInitialized && this::categories.isInitialized && this::privacies.isInitialized && this::languages.isInitialized && this::licences.isInitialized) { + val channelAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item) + for (channel in channels) { + channelAdapter.add(channel.name) + } + + val categoryAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item) + val categoryList = ArrayList(categories.keys) + categoryList.sort() + categoryAdapter.addAll(categoryList) + + val licencesAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item) + licencesAdapter.addAll(licences.keys) + licencesAdapter.sort { o1, o2 -> licences[o1]!!.compareTo(licences[o2]!!)} + + val privacyAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item) + privacyAdapter.addAll(privacies.keys) + privacyAdapter.sort { o1, o2 -> privacies[o1]!!.compareTo(privacies[o2]!!)} + + + val languageAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item) + val languageList = ArrayList(languages.keys) + languageList.sort() + languageAdapter.addAll(languageList) + + runOnUiThread { + binding.goLive.isEnabled = true + binding.channelList.adapter = channelAdapter + binding.categoryList.adapter = categoryAdapter + binding.privacyList.adapter = privacyAdapter + binding.licenceList.adapter = licencesAdapter + binding.languageList.adapter = languageAdapter + binding.loadingProgress.visibility = View.GONE + binding.loadingChannels.visibility = View.GONE + binding.channelList.visibility = View.VISIBLE + binding.liveTitle.visibility = View.VISIBLE + binding.channel.visibility = View.VISIBLE + binding.title.visibility = View.VISIBLE + binding.advanceSettings.visibility = View.VISIBLE + binding.privacy.visibility = View.VISIBLE + binding.privacyList.visibility = View.VISIBLE + restoreSettings() + } + } + } else { + runOnUiThread { + binding.error.text = error + binding.error.visibility = View.VISIBLE + binding.loadingProgress.visibility = View.GONE + binding.loadingChannels.visibility = View.GONE + } + } + } + + private fun goLive(streamSettings: StreamSettings) { + InstanceManager.createLive(this,oAuthData.baseUrl!!,oAuthData,streamSettings,object : InstanceManager.InstanceListener { + override fun onSuccess(args: Bundle?) { + if(args != null) { + val streamData = args.getParcelable(InstanceManager.EXTRA_DATA)!! + val intent = Intent(this@CreateLiveActivity, StreamActivity::class.java) + intent.putExtra(InstanceManager.EXTRA_DATA,streamData) + startActivityForResult(intent,2) + } + } + + override fun onError(error: String?) { + runOnUiThread { + binding.error.text = error + binding.error.visibility = View.VISIBLE + } + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + + } + + }) + } + + private fun toggleAdvanceSettings() { + showAdvancedSettings = !showAdvancedSettings + var status = View.VISIBLE + binding.advanceSettings.setText(R.string.advanced_settings_expand) + if (!showAdvancedSettings) { + status = View.GONE + binding.advanceSettings.setText(R.string.advanced_settings) + } + + + binding.category.visibility = status + binding.categoryList.visibility = status + binding.licence.visibility = status + binding.licenceList.visibility = status + binding.language.visibility = status + binding.languageList.visibility = status + binding.description.visibility = status + binding.descriptionTitle.visibility = status + binding.commentsEnabled.visibility = status + binding.commentsEnabledTitle.visibility = status + binding.downloadEnabled.visibility = status + binding.downloadEnabledTitle.visibility = status + binding.nsfw.visibility = status + binding.nsfwTitle.visibility = status + binding.saveReplay.visibility = status + binding.saveReplayTitle.visibility = status + binding.saveReplayInfo.visibility = status + } + + private fun restoreSettings() { + val settings = DatabaseManager.getStreamSettings(this) + if (settings != null) { + binding.commentsEnabled.isChecked = settings.comments + binding.downloadEnabled.isChecked = settings.download + binding.nsfw.isChecked = settings.nsfw + binding.saveReplay.isChecked = settings.saveReplay + binding.liveTitle.setText(settings.title) + + if (settings.privacy != 0) { + for (privacyIdx in 0..privacies.count()) { + val privacy = binding.privacyList.getItemAtPosition(privacyIdx) + if (privacies[privacy] == settings.privacy) { + binding.privacyList.setSelection(privacyIdx) + break + } + } + } + binding.privacyList.setSelection(settings.privacy -1) + + if (settings.licence != 0 && settings.licence != null) { + for (licenceIdx in 0..licences.count()) { + val licence = binding.licenceList.getItemAtPosition(licenceIdx) + if (licences[licence] == settings.licence) { + binding.licenceList.setSelection(licenceIdx) + break + } + } + } + + if(settings.category != 0) { + for (categoryIdx in 0..categories.count()) { + val category = binding.categoryList.getItemAtPosition(categoryIdx) + if (categories[category] == settings.category) { + binding.categoryList.setSelection(categoryIdx) + break + } + } + } + if (settings.language != null) { + for (languageIdx in 0..languages.count()) { + val language = binding.languageList.getItemAtPosition(languageIdx) + if (languages[language].equals(settings.language)) { + binding.languageList.setSelection(languageIdx) + break + } + } + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + setResult(resultCode) + finish() + } + +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/activity/MainActivity.kt b/app/src/main/java/fr/mobdev/peertubelive/activity/MainActivity.kt new file mode 100644 index 0000000..92e3574 --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/activity/MainActivity.kt @@ -0,0 +1,143 @@ +package fr.mobdev.peertubelive.activity + +import android.content.DialogInterface +import android.content.Intent +import android.os.Bundle +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.WindowManager +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.LinearLayoutManager +import fr.mobdev.peertubelive.R +import fr.mobdev.peertubelive.databinding.HomeBinding +import fr.mobdev.peertubelive.dialog.AddInstanceDialog +import fr.mobdev.peertubelive.manager.DatabaseManager +import fr.mobdev.peertubelive.objects.OAuthData +import java.util.* + +class MainActivity : AppCompatActivity() { + + private lateinit var accounts : List + private lateinit var adapter: AccountAdapter + private lateinit var binding: HomeBinding + + override fun onCreate(savedInstanceState: Bundle?) { + window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.home) + binding.instanceList.layoutManager = LinearLayoutManager(binding.root.context) + setupList() + } + + override fun onResume() { + super.onResume() + setupList() + } + + private fun setupList() { + accounts = DatabaseManager.getCredentials(binding.root.context) + if (accounts.isNotEmpty()) { + if (!this::adapter.isInitialized) { + adapter = AccountAdapter(accounts) + adapter.onDeleteAccount = object: AccountAdapter.OnDeleteAccount { + override fun onDeleteAccount(oAuthData: OAuthData) { + val builder = AlertDialog.Builder(this@MainActivity) + builder.setMessage(getString(R.string.delete_account, oAuthData.username, oAuthData.baseUrl)) + builder.setTitle(R.string.delete_account_title) + builder.setPositiveButton(R.string.yes){ _: DialogInterface, _: Int -> + DatabaseManager.deleteAccount(this@MainActivity, oAuthData) + setupList() + } + builder.setNegativeButton(R.string.no){ _: DialogInterface, _: Int -> + //Do Nothing + } + builder.show() + } + + }; + adapter.onClickListener = object: AccountAdapter.OnClickListener { + + + override fun onClick(oAuthData: OAuthData) { + if (oAuthData.refreshTokenExpires < Calendar.getInstance().timeInMillis) { + addOrUpdateAccount(oAuthData) + } else { + goLive(oAuthData) + } + } + } + binding.instanceList.adapter = adapter + } else { + adapter.setAccounts(accounts) + } + binding.noInstance.visibility = View.GONE + binding.instanceList.visibility = View.VISIBLE + } + else { + binding.noInstance.visibility = View.VISIBLE + binding.instanceList.visibility = View.GONE + } + } + + private fun goLive(oAuthData: OAuthData) { + val intent = Intent(this, CreateLiveActivity::class.java) + intent.putExtra(CreateLiveActivity.OAUTH_DATA, oAuthData) + startActivityForResult(intent,1) + } + + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + super.onCreateOptionsMenu(menu) + menuInflater.inflate(R.menu.home, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if(item.itemId == R.id.add_instance) { + addOrUpdateAccount(null) + return true + } + return false + } + + private fun addOrUpdateAccount(shouldUpdateOAuthData: OAuthData?) { + val wizard = AddInstanceDialog() + if(shouldUpdateOAuthData != null) + wizard.setOauthData(shouldUpdateOAuthData) + wizard.setOnAddInstanceListener(object : AddInstanceDialog.OnAddInstanceListener { + override fun addSuccess(oAuthData: OAuthData) { + runOnUiThread { + setupList() + if (shouldUpdateOAuthData != null) { + goLive(oAuthData) + } + } + } + }) + wizard.show(supportFragmentManager, "Wizard") + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + val alertBuilder = AlertDialog.Builder(this) + alertBuilder.setTitle(R.string.stream_ended) + when (resultCode) { + StreamActivity.BACKGROUND -> { + alertBuilder.setMessage(R.string.background_reason) + } + StreamActivity.BACK -> { + alertBuilder.setMessage(R.string.back_reason) + } + StreamActivity.LOCK -> { + alertBuilder.setMessage(R.string.lock_reason) + } + } + alertBuilder.setPositiveButton(android.R.string.ok,null) + alertBuilder.show() + + + } + +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/activity/StreamActivity.kt b/app/src/main/java/fr/mobdev/peertubelive/activity/StreamActivity.kt new file mode 100644 index 0000000..451a355 --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/activity/StreamActivity.kt @@ -0,0 +1,336 @@ +package fr.mobdev.peertubelive.activity + +import android.Manifest.permission +import android.content.* +import android.content.pm.PackageManager +import android.hardware.SensorManager +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.Settings +import android.view.OrientationEventListener +import android.view.SurfaceHolder +import android.view.View +import android.view.WindowManager +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import com.pedro.encoder.input.video.CameraHelper +import com.pedro.rtplibrary.rtmp.RtmpCamera1 +import net.ossrs.rtmp.ConnectCheckerRtmp +import fr.mobdev.peertubelive.R +import fr.mobdev.peertubelive.databinding.StreamBinding +import fr.mobdev.peertubelive.manager.InstanceManager.EXTRA_DATA +import fr.mobdev.peertubelive.objects.StreamData + +class StreamActivity : AppCompatActivity() { + + + private lateinit var binding: StreamBinding + private lateinit var rtmpCamera1 : RtmpCamera1 + private lateinit var streamData: StreamData + private lateinit var orientationEventListener: OrientationEventListener + private lateinit var lockReceiver: BroadcastReceiver + private var surfaceInit: Boolean = false + private var permissionGiven: Boolean = false + private var streamIsActive: Boolean = false + private var screenOrientation: Int = 0 + private var lastScreenOrientation: Int = 0 + private var orientationCounter: Int = 0 + private var rotationIsLanternEnabled: Boolean = true + + companion object { + const val BACKGROUND :Int = 1 + const val LOCK :Int = 2 + const val BACK :Int = 3 + + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + binding = DataBindingUtil.setContentView(this, R.layout.stream) + + orientationEventListener = object: OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL){ + override fun onOrientationChanged(orientation: Int) { + if(orientation < 0 || !rotationIsLanternEnabled) + return + var localOrientation: Int + localOrientation = when (orientation) { + in 45..135 -> { + 90 + } + in 135..225 -> { + 180 + } + in 225..315 -> { + 270 + } + else -> { + 0 + } + } + + if(localOrientation != lastScreenOrientation) { + lastScreenOrientation = localOrientation + orientationCounter = 0 + } else { + orientationCounter++ + } + + if (lastScreenOrientation != screenOrientation && orientationCounter > 30) { + screenOrientation = lastScreenOrientation + rtmpCamera1.glInterface.setStreamRotation(screenOrientation) + + if (screenOrientation == 90) { + localOrientation = 270 + } else if(screenOrientation == 270) { + localOrientation = 90 + } + binding.flash.rotation = localOrientation.toFloat() + binding.muteMicro.rotation = localOrientation.toFloat() + binding.switchCamera.rotation = localOrientation.toFloat() + } + } + } + orientationEventListener.enable() + + streamData = intent.getParcelableExtra(EXTRA_DATA)!! + binding.switchCamera.setOnClickListener { rtmpCamera1.switchCamera() } + binding.muteMicro.setOnClickListener { + if (rtmpCamera1.isAudioMuted) { + rtmpCamera1.enableAudio() + binding.muteMicro.setImageResource(R.drawable.baseline_volume_up_24) + } + else { + rtmpCamera1.disableAudio() + binding.muteMicro.setImageResource(R.drawable.baseline_volume_off_24) + } + } + binding.flash.setOnClickListener { + if (rtmpCamera1.isLanternEnabled) { + rtmpCamera1.disableLantern() + binding.flash.setImageResource(R.drawable.baseline_flash_off_24) + } + else { + rtmpCamera1.enableLantern() + binding.flash.setImageResource(R.drawable.baseline_flash_on_24) + } + } + + binding.rotation.setOnClickListener { + if (rotationIsLanternEnabled) { + rotationIsLanternEnabled = !rotationIsLanternEnabled + binding.rotation.setImageResource(R.drawable.baseline_screen_lock_rotation_24) + } + else { + rotationIsLanternEnabled = !rotationIsLanternEnabled + binding.rotation.setImageResource(R.drawable.baseline_screen_rotation_24) + } + } + binding.surfaceView.holder.addCallback(object: SurfaceHolder.Callback { + override fun surfaceCreated(p0: SurfaceHolder) { + surfaceInit = true + if (permissionGiven) + startStream() + } + + override fun surfaceChanged(p0: SurfaceHolder, p1: Int, p2: Int, p3: Int) { + + } + + override fun surfaceDestroyed(p0: SurfaceHolder) { + if(rtmpCamera1.isStreaming) { + rtmpCamera1.stopStream() + } + rtmpCamera1.stopPreview() + + } + + } + ) + + lockReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action.equals(Intent.ACTION_SCREEN_OFF)){ + setResult(LOCK) + finish() + } else if (intent?.action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){ + val reason = intent?.getStringExtra("reason") + if(reason.equals("homekey")){ + setResult(BACKGROUND) + finish() + } + } + } + } + val filter = IntentFilter(Intent.ACTION_SCREEN_OFF) + filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS) + registerReceiver(lockReceiver, filter) + } + + override fun onResume() { + super.onResume() + val permissions = getUnAllowedPermissions() + + if(permissions.isNotEmpty()) { + var shouldShowRequest = true + for(perm in permissions){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + shouldShowRequest = shouldShowRequest && shouldShowRequestPermissionRationale(perm) + } + + if(shouldShowRequest) { + binding.permissionInfo.visibility = View.VISIBLE + binding.gotoPermission.visibility = View.VISIBLE + binding.surfaceView.visibility = View.GONE + binding.gotoPermission.setOnClickListener { + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intent.data = Uri.fromParts("package", packageName, null) + startActivity(intent) + } + } else { + ActivityCompat.requestPermissions(this, permissions.toTypedArray(), 1) + } + } else { + permissionGiven = true + if(surfaceInit && !streamIsActive) + startStream() + } + } + + override fun onStop() { + super.onStop() + if (!hasWindowFocus()) { + unregisterReceiver(lockReceiver) + setResult(BACKGROUND) + finish() + } + } + + override fun onBackPressed() { + val alertBuilder = AlertDialog.Builder(this) + alertBuilder.setTitle(R.string.end_stream) + alertBuilder.setMessage(R.string.ask_end_stream) + alertBuilder.setPositiveButton(R.string.yes) { _: DialogInterface, _: Int -> + setResult(BACK) + finish() + } + alertBuilder.setNegativeButton(R.string.no,null) + alertBuilder.show() + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + var allPermissionGranted = true + for (result in grantResults) { + allPermissionGranted = allPermissionGranted && (result == PackageManager.PERMISSION_GRANTED) + } + + if (allPermissionGranted) { + permissionGiven = true + if(surfaceInit && !streamIsActive) + startStream() + } else { + binding.permissionInfo.visibility = View.VISIBLE + binding.gotoPermission.visibility = View.VISIBLE + binding.surfaceView.visibility = View.GONE + } + } + + private fun startStream() { + streamIsActive = true + binding.permissionInfo.visibility = View.GONE + binding.gotoPermission.visibility = View.GONE + binding.surfaceView.visibility = View.VISIBLE + + val connectChecker : ConnectCheckerRtmp = object : ConnectCheckerRtmp { + override fun onConnectionSuccessRtmp() { + runOnUiThread { + Toast.makeText(binding.root.context, "Connection success", Toast.LENGTH_SHORT).show(); + + } + } + + override fun onConnectionFailedRtmp(reason: String) { + runOnUiThread { + Toast.makeText(binding.root.context, "Connection failed", Toast.LENGTH_SHORT).show(); + rtmpCamera1.stopStream() + } + } + + override fun onNewBitrateRtmp(bitrate: Long) { + + } + + override fun onDisconnectRtmp() { + runOnUiThread { + Toast.makeText(binding.root.context, "Disconnect", Toast.LENGTH_SHORT).show(); + } + + } + + override fun onAuthErrorRtmp() { + runOnUiThread { + Toast.makeText(binding.root.context, "Auth Error", Toast.LENGTH_SHORT).show(); + } + + } + + override fun onAuthSuccessRtmp() { + runOnUiThread { + Toast.makeText(binding.root.context, "Auth Success", Toast.LENGTH_SHORT).show(); + } + } + } + + rtmpCamera1 = RtmpCamera1(binding.surfaceView, connectChecker) + + var resolutions = rtmpCamera1.resolutionsBack + var width: Int + var height: Int + if(resolutions[0].width > resolutions[0].height) { + width = resolutions[0].width + height = resolutions[0].height + } else { + width = resolutions[0].height + height = resolutions[0].width + } + for(res in resolutions) { + if (width * height < res.width * res.width) { + if(res.width > res.height) { + width = res.width + height = res.height + } else { + width = res.height + height = res.width + } + } + } + + rtmpCamera1.startPreview(width,height) +//start stream + + if (rtmpCamera1.prepareAudio() && rtmpCamera1.prepareVideo(width,height,30,3000*1024,false,CameraHelper.getCameraOrientation(this))) { + rtmpCamera1.startStream(streamData.url+"/"+streamData.key) + } else { + /**This device cant init encoders, this could be for 2 reasons: The encoder selected doesnt support any configuration setted or your device hasnt a H264 or AAC encoder (in this case you can see log error valid encoder not found) */ + } + } + + private fun getUnAllowedPermissions(): List { + val permissions: ArrayList = ArrayList() + + if (ContextCompat.checkSelfPermission(this, permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + permissions.add(permission.CAMERA) + } + if (ContextCompat.checkSelfPermission(this, permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { + permissions.add(permission.RECORD_AUDIO) + } + return permissions + } + +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/dialog/AddInstanceDialog.kt b/app/src/main/java/fr/mobdev/peertubelive/dialog/AddInstanceDialog.kt new file mode 100644 index 0000000..5e702ad --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/dialog/AddInstanceDialog.kt @@ -0,0 +1,168 @@ +package fr.mobdev.peertubelive.dialog + +import android.app.Dialog +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.LayoutInflater +import android.view.View +import androidx.appcompat.app.AlertDialog +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import fr.mobdev.peertubelive.R +import fr.mobdev.peertubelive.databinding.AddInstanceBinding +import fr.mobdev.peertubelive.manager.DatabaseManager +import fr.mobdev.peertubelive.manager.InstanceManager +import fr.mobdev.peertubelive.objects.OAuthData +import java.net.MalformedURLException +import java.net.URL + +class AddInstanceDialog : DialogFragment() { + + private var onAddInstanceListener: OnAddInstanceListener? = null + private lateinit var oAuthData: OAuthData + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val binding = DataBindingUtil.inflate(LayoutInflater.from(requireContext()), R.layout.add_instance,null,false) + + val builder = AlertDialog.Builder(requireContext()) + + builder.setTitle(R.string.add_instance) + builder.setPositiveButton(R.string.connect, null) + builder.setNegativeButton(R.string.cancel) { dialog,_ -> dialog.dismiss() } + builder.setView(binding.root) + binding.errorUsername.visibility = View.GONE + binding.errorInstance.visibility = View.GONE + binding.errorPassword.visibility = View.GONE + binding.tryConnect.visibility = View.GONE + binding.tryConnectMsg.visibility = View.GONE + + if (this::oAuthData.isInitialized) + { + binding.username.isEnabled = false + binding.instance.isEnabled = false + binding.instance.setText(oAuthData.baseUrl) + binding.username.setText(oAuthData.username) + } + + + val dialog = builder.create() + dialog.setOnShowListener { + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + val username = binding.username.text.toString() + val password = binding.password.text.toString() + var instance = binding.instance.text.toString() + binding.errorUsername.visibility = View.GONE + binding.errorInstance.visibility = View.GONE + binding.errorPassword.visibility = View.GONE + binding.error.visibility = View.GONE + var inError = false + if(username.isEmpty()) + { + binding.errorUsername.visibility = View.VISIBLE + inError = true + } + if(password.isEmpty()) + { + binding.errorPassword.visibility = View.VISIBLE + inError = true + } + if(instance.isEmpty()) + { + binding.errorInstance.visibility = View.VISIBLE + binding.errorInstance.setText(R.string.instance_error) + inError = true + } else { + if(!instance.startsWith("https://")) + instance = "https://$instance" + if (instance.endsWith("/")) + instance = instance.removeRange(instance.length-1,instance.length) + try { + URL(instance) + } catch (e: MalformedURLException) { + binding.errorInstance.visibility = View.VISIBLE + binding.errorInstance.setText(R.string.malformed_instance_error) + inError = true + } + } + if (DatabaseManager.existsCredential(requireContext(),instance,username)) { + inError = true + binding.error.visibility = View.VISIBLE + binding.error.text = requireContext().getString(R.string.account_exist) + } + if(!inError) { + binding.errorUsername.visibility = View.GONE + binding.errorInstance.visibility = View.GONE + binding.errorPassword.visibility = View.GONE + binding.error.visibility = View.GONE + binding.username.visibility = View.GONE + binding.password.visibility = View.GONE + binding.instance.visibility = View.GONE + binding.usernameTitle.visibility = View.GONE + binding.passwordTitle.visibility = View.GONE + binding.instanceTitle.visibility = View.GONE + binding.tryConnect.visibility = View.VISIBLE + binding.tryConnectMsg.visibility = View.VISIBLE + + dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).isEnabled = false + val listener = object : InstanceManager.InstanceListener { + override fun onSuccess(args: Bundle?) { + val oauthData: OAuthData? = args?.getParcelable(InstanceManager.EXTRA_DATA) + if (oauthData != null) { + if (this@AddInstanceDialog::oAuthData.isInitialized) { + DatabaseManager.updateCredentials(requireContext(), oauthData) + } else { + DatabaseManager.addNewCredentials(requireContext(), oauthData) + } + onAddInstanceListener?.addSuccess(oauthData) + dialog.dismiss() + } + } + + override fun onError(error: String?) { + Handler(Looper.getMainLooper()).post { + binding.error.visibility = View.VISIBLE + binding.tryConnect.visibility = View.GONE + binding.tryConnectMsg.visibility = View.GONE + binding.username.visibility = View.VISIBLE + binding.password.visibility = View.VISIBLE + binding.instance.visibility = View.VISIBLE + binding.usernameTitle.visibility = View.VISIBLE + binding.passwordTitle.visibility = View.VISIBLE + binding.instanceTitle.visibility = View.VISIBLE + binding.error.text = error + dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = true + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).isEnabled = true + } + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + DatabaseManager.updateCredentials(requireContext(), oauthData) + } + + }; + if (this::oAuthData.isInitialized) { + InstanceManager.getUserToken(requireContext(), instance, username, password, oAuthData, listener) + } else { + InstanceManager.registerAccount(requireContext(), instance, username, password,listener) + } + } + } + } + return dialog + } + + fun setOnAddInstanceListener(listener: OnAddInstanceListener) { + onAddInstanceListener = listener + } + + fun setOauthData(oAuthData: OAuthData) { + this.oAuthData = oAuthData + } + + interface OnAddInstanceListener { + fun addSuccess(oAuthData: OAuthData) + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/manager/DatabaseHelper.kt b/app/src/main/java/fr/mobdev/peertubelive/manager/DatabaseHelper.kt new file mode 100644 index 0000000..ba8321b --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/manager/DatabaseHelper.kt @@ -0,0 +1,73 @@ +package fr.mobdev.peertubelive.manager + +import android.content.ContentValues +import android.content.Context +import android.database.Cursor +import android.database.sqlite.SQLiteDatabase +import android.database.sqlite.SQLiteOpenHelper + +class DatabaseHelper(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, 2) { + + companion object { + const val DB_NAME: String = "peeriscope.db" + const val TABLE_CREDS: String = "Credentials" + const val CREDS_USERNAME: String = "Username" + const val CREDS_BASE_URL: String = "Instance" + const val CREDS_CLIENT_ID: String = "ClientID" + const val CREDS_CLIENT_SECRET: String = "ClientSecret" + const val CREDS_ACCESS_TOKEN: String = "AccessToken" + const val CREDS_TOKEN_TYPE: String = "TokenType" + const val CREDS_EXPIRES: String = "Expires" + const val CREDS_REFRESH_TOKEN: String = "RefreshToken" + const val CREDS_REFRESH_EXPIRES: String = "RefreshTokenExpires" + const val TABLE_STREAM_SETTINGS: String = "Settings" + const val SETS_TITLE: String = "Title" + const val SETS_CATEGORY: String = "Category" + const val SETS_PRIVACY : String = "Privacy" + const val SETS_LANGUAGE : String = "Language" + const val SETS_LICENCE : String = "Licence" + const val SETS_COMMENTS : String = "Comments" + const val SETS_DOWNLOAD : String = "Download" + const val SETS_REPLAY : String = "Replay" + const val SETS_NSFW : String = "Nsfw" + } + + override fun onCreate(db: SQLiteDatabase?) { + db?.execSQL("CREATE TABLE IF NOT EXISTS $TABLE_CREDS (id INTEGER PRIMARY KEY, $CREDS_USERNAME TEXT, $CREDS_BASE_URL TEXT, " + + "$CREDS_CLIENT_ID TEXT, $CREDS_CLIENT_SECRET TEXT, $CREDS_ACCESS_TOKEN TEXT, " + + "$CREDS_TOKEN_TYPE TEXT, $CREDS_EXPIRES INTEGER, $CREDS_REFRESH_TOKEN TEXT, $CREDS_REFRESH_EXPIRES INTEGER);") + + db?.execSQL("CREATE TABLE IF NOT EXISTS $TABLE_STREAM_SETTINGS (id INTEGER PRIMARY KEY, $SETS_TITLE TEXT, $SETS_CATEGORY INTEGER, $SETS_PRIVACY INTEGER, " + + "$SETS_LANGUAGE TEXT, $SETS_LICENCE INTEGER, $SETS_COMMENTS INTEGER, " + + "$SETS_DOWNLOAD INTEGER, $SETS_REPLAY INTEGER, $SETS_NSFW INTEGER);") + + val values = ContentValues() + values.put("id",1) + values.put(SETS_TITLE,"Live") + values.put(SETS_COMMENTS,true) + values.put(SETS_DOWNLOAD,true) + values.put(SETS_NSFW,false) + values.put(SETS_REPLAY,false) + db?.insert(TABLE_STREAM_SETTINGS,null,values) + } + + override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { + db?.execSQL("ALTER TABLE $TABLE_CREDS add column $CREDS_REFRESH_EXPIRES INTEGER;") + } + + fun insert(table: String, values: ContentValues): Long { + return writableDatabase.insert(table,null,values) + } + + fun update(table: String, values: ContentValues, whereClause: String?, whereArgs: Array): Int { + return writableDatabase.update(table,values,whereClause,whereArgs) + } + + fun delete(table: String, whereClause: String?, whereArgs: Array?): Int { + return writableDatabase.delete(table,whereClause,whereArgs) + } + + fun query(table: String, columns: Array?, whereClause: String?, whereArgs: Array?): Cursor { + return readableDatabase.query(table,columns,whereClause,whereArgs,null,null,null) + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/manager/DatabaseManager.kt b/app/src/main/java/fr/mobdev/peertubelive/manager/DatabaseManager.kt new file mode 100644 index 0000000..89d24d5 --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/manager/DatabaseManager.kt @@ -0,0 +1,132 @@ +package fr.mobdev.peertubelive.manager + +import android.content.ContentValues +import android.content.Context +import android.database.Cursor +import fr.mobdev.peertubelive.objects.OAuthData +import fr.mobdev.peertubelive.objects.StreamSettings + +object DatabaseManager { + private var databaseHelper: DatabaseHelper? = null + + + fun addNewCredentials(context: Context, oAuthData: OAuthData) { + if (databaseHelper == null) + databaseHelper = DatabaseHelper(context) + + val values = ContentValues() + values.put(DatabaseHelper.CREDS_BASE_URL,oAuthData.baseUrl) + values.put(DatabaseHelper.CREDS_USERNAME,oAuthData.username) + values.put(DatabaseHelper.CREDS_CLIENT_ID,oAuthData.clientId) + values.put(DatabaseHelper.CREDS_CLIENT_SECRET,oAuthData.clientSecret) + values.put(DatabaseHelper.CREDS_ACCESS_TOKEN,oAuthData.accessToken) + values.put(DatabaseHelper.CREDS_TOKEN_TYPE,oAuthData.tokenType) + values.put(DatabaseHelper.CREDS_EXPIRES,oAuthData.expires) + values.put(DatabaseHelper.CREDS_REFRESH_TOKEN,oAuthData.refreshToken) + values.put(DatabaseHelper.CREDS_REFRESH_EXPIRES,oAuthData.refreshTokenExpires) + databaseHelper?.insert(DatabaseHelper.TABLE_CREDS,values) + + } + + fun updateCredentials(context: Context, oAuthData: OAuthData) { + if (databaseHelper == null) + databaseHelper = DatabaseHelper(context) + + val values = ContentValues() + val whereClause = "${DatabaseHelper.CREDS_USERNAME} = ? AND ${DatabaseHelper.CREDS_BASE_URL} = ? AND ${DatabaseHelper.CREDS_CLIENT_SECRET} = ?" + val whereArgs = arrayOf(oAuthData.username , oAuthData.baseUrl , oAuthData.clientSecret) + values.put(DatabaseHelper.CREDS_ACCESS_TOKEN,oAuthData.accessToken) + values.put(DatabaseHelper.CREDS_TOKEN_TYPE,oAuthData.tokenType) + values.put(DatabaseHelper.CREDS_EXPIRES,oAuthData.expires) + values.put(DatabaseHelper.CREDS_REFRESH_TOKEN,oAuthData.refreshToken) + values.put(DatabaseHelper.CREDS_REFRESH_EXPIRES,oAuthData.refreshTokenExpires) + databaseHelper?.update(DatabaseHelper.TABLE_CREDS,values,whereClause,whereArgs) + } + + fun getCredentials(context: Context): List { + if (databaseHelper == null) + databaseHelper = DatabaseHelper(context) + val oAuthDatas: ArrayList = ArrayList() + val cursor: Cursor? = databaseHelper?.query(DatabaseHelper.TABLE_CREDS,null,null,null) + while (cursor?.moveToNext() == true) { + var col = 1 + val username: String = cursor.getString(col++) + val baseUrl: String = cursor.getString(col++) + val clientId: String = cursor.getString(col++) + val clientSecret: String = cursor.getString(col++) + val accessToken: String = cursor.getString(col++) + val tokenType: String = cursor.getString(col++) + val expires: Long = cursor.getLong(col++) + val refreshToken: String = cursor.getString(col++) + val refreshTokenExpires: Long = cursor.getLong(col) + var oAuthData = OAuthData(baseUrl,username,clientId,clientSecret,accessToken,tokenType,expires,refreshToken,refreshTokenExpires) + oAuthDatas.add(oAuthData) + + } + cursor?.close() + return oAuthDatas + } + + fun existsCredential(context: Context, url: String, username: String): Boolean { + if (databaseHelper == null) + databaseHelper = DatabaseHelper(context) + val columns = arrayOf(DatabaseHelper.CREDS_BASE_URL, DatabaseHelper.CREDS_USERNAME) + val whereClause = "${DatabaseHelper.CREDS_USERNAME} = ? AND ${DatabaseHelper.CREDS_BASE_URL} = ?" + val whereArgs = arrayOf(username, url) + val cursor: Cursor? = databaseHelper?.query(DatabaseHelper.TABLE_CREDS,columns,whereClause,whereArgs) + val exist = cursor?.count != 0 + cursor?.close() + return exist + } + + fun deleteAccount(context: Context, oAuthData: OAuthData) { + if (databaseHelper == null) + databaseHelper = DatabaseHelper(context) + val whereClause = "${DatabaseHelper.CREDS_USERNAME} = ? AND ${DatabaseHelper.CREDS_BASE_URL} = ? AND ${DatabaseHelper.CREDS_CLIENT_ID} = ?" + val whereArgs = arrayOf(oAuthData.username, oAuthData.baseUrl, oAuthData.clientId) + databaseHelper?.delete(DatabaseHelper.TABLE_CREDS,whereClause,whereArgs) + } + + fun getStreamSettings(context: Context): StreamSettings? { + if (databaseHelper == null) + databaseHelper = DatabaseHelper(context) + + val cursor: Cursor? = databaseHelper?.query(DatabaseHelper.TABLE_STREAM_SETTINGS,null,null,null) + var streamSettings: StreamSettings? = null + if(cursor?.moveToNext() == true) { + var col = 1 + val title: String = cursor.getString(col++) + val category: Int = cursor.getInt(col++) + val privacy: Int = cursor.getInt(col++) + val language: String? = cursor.getString(col++) + val licence: Int = cursor.getInt(col++) + val comments: Boolean = cursor.getInt(col++) == 1 + val download: Boolean = cursor.getInt(col++) == 1 + val saveReplay: Boolean = cursor.getInt(col++) == 1 + val nsfw: Boolean = cursor.getInt(col) == 1 + streamSettings = StreamSettings(title,0,privacy,category,language,licence,null,comments,download,nsfw,saveReplay) + } + cursor?.close() + return streamSettings + } + + fun updateStreamSettings(context: Context, streamSettings: StreamSettings) { + if (databaseHelper == null) + databaseHelper = DatabaseHelper(context) + val values = ContentValues() + values.put(DatabaseHelper.SETS_TITLE,streamSettings.title) + values.put(DatabaseHelper.SETS_PRIVACY,streamSettings.privacy) + values.put(DatabaseHelper.SETS_CATEGORY,streamSettings.category) + values.put(DatabaseHelper.SETS_COMMENTS,streamSettings.comments) + values.put(DatabaseHelper.SETS_DOWNLOAD,streamSettings.download) + values.put(DatabaseHelper.SETS_NSFW,streamSettings.nsfw) + values.put(DatabaseHelper.SETS_REPLAY,streamSettings.saveReplay) + values.put(DatabaseHelper.SETS_LANGUAGE,streamSettings.language) + values.put(DatabaseHelper.SETS_LICENCE,streamSettings.licence) + + + val whereClause = "id = ?" + val whereArgs: Array = arrayOf("1") + databaseHelper?.update(DatabaseHelper.TABLE_STREAM_SETTINGS,values,whereClause,whereArgs) + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/manager/InstanceManager.kt b/app/src/main/java/fr/mobdev/peertubelive/manager/InstanceManager.kt new file mode 100644 index 0000000..244a522 --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/manager/InstanceManager.kt @@ -0,0 +1,473 @@ +package fr.mobdev.peertubelive.manager + +import android.content.Context +import android.os.Bundle +import fr.mobdev.peertubelive.R +import fr.mobdev.peertubelive.objects.ChannelData +import fr.mobdev.peertubelive.objects.OAuthData +import fr.mobdev.peertubelive.objects.StreamData +import fr.mobdev.peertubelive.objects.StreamSettings +import org.json.JSONObject +import java.lang.Exception +import java.util.* +import kotlin.collections.ArrayList +import kotlin.collections.HashMap + +object InstanceManager { + private val oauthManager : OAuthManager = OAuthManager() + + private const val BASE_API_ENDPOINT: String = "/api/v1" + private const val REGISTER_CLIENT_ENDPOINT: String = "/oauth-clients/local" + private const val GET_USER_CLIENT_ENDPOINT: String = "/users/token" + private const val GET_USER_INFO_ENDPOINT: String = "/users/me" + private const val CREATE_LIVE_ENDPOINT: String = "/videos/live" + private const val GET_CATEGORY_ENDPOINT: String = "/videos/categories" + private const val GET_PRIVACY_ENDPOINT: String = "/videos/privacies" + private const val GET_LICENCE_ENDPOINT: String = "/videos/licences" + private const val GET_LANGUAGES_ENDPOINT: String = "/videos/languages" + private const val GET_VIDEOS: String = "/users/me/videos" + + internal const val EXTRA_DATA: String = "EXTRA_DATA" + private const val CONTENT_TYPE: String = "CONTENT_TYPE" + private const val CONTENT_DATA: String = "CONTENT_DATA" + + private const val VIDEO_CHANNEL: String = "videoChannels" + private const val CHANNEL_ID: String = "id" + private const val CHANNEL_NAME: String = "displayName" + private const val VIDEO: String = "video" + private const val UUID: String = "uuid" + private const val RTMP_URL: String = "rtmpUrl" + private const val STREAM_KEY: String = "streamKey" + + fun registerAccount(context: Context, url: String, username: String, password: String, listener: InstanceListener) { + val registerUrl = url + BASE_API_ENDPOINT+ REGISTER_CLIENT_ENDPOINT + val internalListener: InstanceListener = object : InstanceListener { + override fun onSuccess(args: Bundle?) { + val oauthData: OAuthData? = args?.getParcelable(EXTRA_DATA) + oauthData?.baseUrl = url + if (oauthData != null) + getUserToken(context, url, username, password,oauthData, listener) + else + listener.onError(context.getString(R.string.unknwon_error)) + } + + override fun onError(error: String?) { + listener.onError(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + listener.onUpdateOAuthData(oauthData) + } + + } + oauthManager.register(context,registerUrl,internalListener) + } + + fun getUserToken(context: Context, url: String, username: String, password: String, oauthData: OAuthData, listener: InstanceListener) { + val userAccess = url + BASE_API_ENDPOINT + GET_USER_CLIENT_ENDPOINT + oauthManager.getUserToken(context, userAccess, username, password, oauthData, listener) + } + + private fun refreshToken(context: Context, url: String, oauthData: OAuthData, listener: InstanceListener) { + val registerUrl = url + BASE_API_ENDPOINT+ GET_USER_CLIENT_ENDPOINT + oauthManager.refreshToken(context, registerUrl, oauthData, listener) + } + + fun createLive(context: Context, url: String, oauthData: OAuthData, streamSettings: StreamSettings, listener: InstanceListener) { + if(oauthData.expires < Calendar.getInstance().timeInMillis) { + refreshToken(context,url,oauthData,object: InstanceListener { + override fun onSuccess(args: Bundle?) { + val oauth: OAuthData? = args?.getParcelable(InstanceManager.EXTRA_DATA) + if (oauth != null) { + DatabaseManager.updateCredentials(context,oauth) + listener.onUpdateOAuthData(oauth) + createLiveImpl(context, url,oauth,streamSettings,listener) + } + } + + override fun onError(error: String?) { + listener.onError(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + listener.onUpdateOAuthData(oauthData) + } + + }) + } else { + createLiveImpl(context, url, oauthData,streamSettings,listener) + } + } + + private fun getStreamKey(context: Context, url: String, oauthData: OAuthData, liveId: String, listener: InstanceListener) { + val liveInfo = "$url$BASE_API_ENDPOINT$CREATE_LIVE_ENDPOINT/$liveId" + val internalListener = object: InstanceListener { + override fun onSuccess(args: Bundle?) { + val response = args?.getString(EXTRA_DATA, null) + if (response == null) { + listener.onError(context.getString(R.string.unknwon_error)) + return + } + val streamData = extractStreamData(response) + if (streamData == null) { + listener.onError(context.getString(R.string.json_error)) + return + } + val results = Bundle() + results.putParcelable(EXTRA_DATA,streamData) + listener.onSuccess(results) + } + + override fun onError(error: String?) { + listener.onError(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + listener.onUpdateOAuthData(oauthData) + } + + } + oauthManager.get(context,liveInfo,oauthData,internalListener) + } + + private fun createLiveImpl(context: Context, url: String, oauthData: OAuthData, streamSettings: StreamSettings, listener: InstanceListener) { + // val comments: Boolean, val download: Boolean, val nsfw: Boolean, val saveReplay: Boolean + val createLiveUrl = url + BASE_API_ENDPOINT + CREATE_LIVE_ENDPOINT + val data = Bundle() + val boundary = "45fcc22" + var formData: String = prepareFormData(boundary,"channelId",streamSettings.channel.toString(),false) + formData += prepareFormData(boundary,"name",streamSettings.title,false) + formData += prepareFormData(boundary,"privacy",streamSettings.privacy.toString(),false) + if(streamSettings.category != null) + formData += prepareFormData(boundary,"category",streamSettings.category.toString(),false) + if(streamSettings.language != null) + formData += prepareFormData(boundary,"language",streamSettings.language.toString(),false) + if(streamSettings.description != null) + formData += prepareFormData(boundary,"description",streamSettings.description.toString(),false) + if(streamSettings.licence != null) + formData += prepareFormData(boundary,"licence",streamSettings.licence.toString(),false) + formData += prepareFormData(boundary,"commentsEnabled",streamSettings.comments.toString(),false) + formData += prepareFormData(boundary,"nsfw",streamSettings.nsfw.toString(),false) + formData += prepareFormData(boundary,"downloadEnabled",streamSettings.download.toString(),false) + formData += prepareFormData(boundary,"saveReplay",streamSettings.saveReplay.toString(),true) + data.putString(CONTENT_TYPE,"multipart/form-data; boundary=$boundary") + data.putString(CONTENT_DATA,formData) + val internalListener = object: InstanceListener { + override fun onSuccess(args: Bundle?) { + val response = args?.getString(EXTRA_DATA, null) + if (response == null) { + listener.onError(context.getString(R.string.unknwon_error)) + return + } + + val liveId = extractLiveId(response) + if (liveId == null) { + listener.onError(context.getString(R.string.json_error)) + return + } + getStreamKey(context,url,oauthData,liveId,listener) + } + + override fun onError(error: String?) { + listener.onError(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + listener.onUpdateOAuthData(oauthData) + } + + } + oauthManager.post(context,createLiveUrl,oauthData,data,internalListener) + } + + fun getUserChannelList(context: Context, url: String, oauthData: OAuthData, listener: InstanceListener) { + if(oauthData.expires < Calendar.getInstance().timeInMillis) { + refreshToken(context,url,oauthData,object: InstanceListener { + override fun onSuccess(args: Bundle?) { + val oauth: OAuthData? = args?.getParcelable(EXTRA_DATA) + if (oauth != null) { + listener.onUpdateOAuthData(oauth) + DatabaseManager.updateCredentials(context,oauth) + getUserChannelListImpl(context, url,oauth,listener) + } + } + + override fun onError(error: String?) { + listener.onError(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + listener.onUpdateOAuthData(oauthData) + } + + }) + } else { + getUserChannelListImpl(context, url, oauthData, listener) + } + } + + private fun getUserChannelListImpl(context: Context, url: String, oauthData: OAuthData, listener: InstanceListener) { + val userInfoUrl: String = url + BASE_API_ENDPOINT + GET_USER_INFO_ENDPOINT + val internalListener : InstanceListener = object : InstanceListener { + override fun onSuccess(args: Bundle?) { + val response = args?.getString(EXTRA_DATA, null) + if (response == null) { + listener.onError(context.getString(R.string.unknwon_error)) + return + } + + val channelList = extractChannelData(response) + if (channelList == null) { + listener.onError(context.getString(R.string.json_error)) + return + } + args.putParcelableArrayList(EXTRA_DATA, channelList) + listener.onSuccess(args) + } + + override fun onError(error: String?) { + listener.onError(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + listener.onUpdateOAuthData(oauthData) + } + } + + oauthManager.get(context,userInfoUrl,oauthData,internalListener) + } + + fun getCategoryList(context: Context, url: String, listener: InstanceListener) { + val userInfoUrl: String = url + BASE_API_ENDPOINT + GET_CATEGORY_ENDPOINT + val internalListener : InstanceListener = object : InstanceListener { + override fun onSuccess(args: Bundle?) { + val response = args?.getString(EXTRA_DATA, null) + if (response == null) { + listener.onError(context.getString(R.string.unknwon_error)) + return + } + + val categoryList = extractMapData(response,0) + if (categoryList == null) { + listener.onError(context.getString(R.string.json_error)) + return + } + categoryList[""]=0 + args.putSerializable(EXTRA_DATA, categoryList) + listener.onSuccess(args) + } + + override fun onError(error: String?) { + listener.onError(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + listener.onUpdateOAuthData(oauthData) + } + } + + oauthManager.get(context,userInfoUrl,null,internalListener) + } + + + fun getPrivacyList(context: Context, url: String, listener: InstanceListener) { + val userInfoUrl: String = url + BASE_API_ENDPOINT + GET_PRIVACY_ENDPOINT + val internalListener : InstanceListener = object : InstanceListener { + override fun onSuccess(args: Bundle?) { + val response = args?.getString(EXTRA_DATA, null) + if (response == null) { + listener.onError(context.getString(R.string.unknwon_error)) + return + } + + val privacyList = extractMapData(response,0) + if (privacyList == null) { + listener.onError(context.getString(R.string.json_error)) + return + } + args.putSerializable(EXTRA_DATA, privacyList) + listener.onSuccess(args) + } + + override fun onError(error: String?) { + listener.onError(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + listener.onUpdateOAuthData(oauthData) + } + } + + oauthManager.get(context,userInfoUrl,null,internalListener) + } + + fun getLicencesList(context: Context, url: String, listener: InstanceListener) { + val userInfoUrl: String = url + BASE_API_ENDPOINT + GET_LICENCE_ENDPOINT + val internalListener : InstanceListener = object : InstanceListener { + override fun onSuccess(args: Bundle?) { + val response = args?.getString(EXTRA_DATA, null) + if (response == null) { + listener.onError(context.getString(R.string.unknwon_error)) + return + } + + val licencesList = extractMapData(response,0) + if (licencesList == null) { + listener.onError(context.getString(R.string.json_error)) + return + } + licencesList[""]=0 + args.putSerializable(EXTRA_DATA, licencesList) + listener.onSuccess(args) + } + + override fun onError(error: String?) { + listener.onError(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + listener.onUpdateOAuthData(oauthData) + } + } + + oauthManager.get(context,userInfoUrl,null,internalListener) + } + + fun getLanguageList(context: Context, url: String, listener: InstanceListener) { + val userInfoUrl: String = url + BASE_API_ENDPOINT + GET_LANGUAGES_ENDPOINT + val internalListener : InstanceListener = object : InstanceListener { + override fun onSuccess(args: Bundle?) { + val response = args?.getString(EXTRA_DATA, null) + if (response == null) { + listener.onError(context.getString(R.string.unknwon_error)) + return + } + + val languageList = extractMapData(response,"") + if (languageList == null) { + listener.onError(context.getString(R.string.json_error)) + return + } + languageList[""]="" + args.putSerializable(EXTRA_DATA, languageList) + listener.onSuccess(args) + } + + override fun onError(error: String?) { + listener.onError(error) + } + + override fun onUpdateOAuthData(oauthData: OAuthData) { + listener.onUpdateOAuthData(oauthData) + } + } + + oauthManager.get(context,userInfoUrl,null,internalListener) + } + + private fun extractChannelData(response: String): ArrayList? { + try { + val json = JSONObject(response) + + if (json.has(VIDEO_CHANNEL)) { + val channelList: ArrayList = ArrayList() + val channels = json.getJSONArray(VIDEO_CHANNEL) + for (i: Int in 0 until channels.length()) { + val channel = channels.getJSONObject(i) + if (channel.has(CHANNEL_NAME) && channel.has(CHANNEL_ID)) { + val name = channel.getString(CHANNEL_NAME) + val id = channel.getLong(CHANNEL_ID) + val channelData = ChannelData(id, name) + channelList.add(channelData) + } else { + return null + } + } + return channelList + } else { + return null + } + } catch (e: Exception) { + e.printStackTrace() + return null + } + } + + private fun extractLiveId(response: String): String? { + try { + val json = JSONObject(response) + + return if(json.has(VIDEO)) { + val video = json.getJSONObject(VIDEO) + if (video.has(UUID)) { + video.getString(UUID) + } else { + null + } + } else { + null + } + } catch (e: Exception) { + e.printStackTrace() + return null + } + } + + + private fun extractStreamData(response: String): StreamData? { + try { + val json = JSONObject(response) + + return if (json.has(RTMP_URL) && json.has(STREAM_KEY)) { + val rtmp = json.getString(RTMP_URL) + val key = json.getString(STREAM_KEY) + + StreamData(rtmp,key) + + } else { + null + } + } catch (e: Exception) { + e.printStackTrace() + return null + } + } + + private fun extractMapData(response: String, type: T): HashMap? { + return try { + val json = JSONObject(response) + val map = HashMap() + for(key in json.keys()) { + if (type is Int) + map[json.getString(key)] = key.toInt() as T + else if (type is String) + map[json.getString(key)] = key as T + } + map + } catch (e: Exception) { + e.printStackTrace() + null + } + } + + + private fun prepareFormData(boundary: String, propertyName: String, property: String, lastData: Boolean): String { + val crlf = "\r\n" + var formData = "--$boundary$crlf" + formData+="Content-Disposition: form-data; name=\"$propertyName\"$crlf$crlf" + formData+="$property$crlf" + + if(lastData) { + formData += "$crlf--$boundary--$crlf" + } + + return formData + } + + + interface InstanceListener{ + fun onSuccess(args: Bundle?) + fun onError(error: String?) + fun onUpdateOAuthData(oauthData: OAuthData) + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/manager/OAuthManager.kt b/app/src/main/java/fr/mobdev/peertubelive/manager/OAuthManager.kt new file mode 100644 index 0000000..1eddfbd --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/manager/OAuthManager.kt @@ -0,0 +1,532 @@ +package fr.mobdev.peertubelive.manager + +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import android.os.Build +import android.os.Bundle +import fr.mobdev.peertubelive.BuildConfig +import fr.mobdev.peertubelive.R +import fr.mobdev.peertubelive.objects.OAuthData +import org.json.JSONObject +import java.io.BufferedReader +import java.io.InputStream +import java.io.InputStreamReader +import java.io.OutputStream +import java.net.HttpURLConnection +import java.net.URL +import java.net.UnknownHostException +import java.util.* +import java.util.concurrent.Semaphore +import kotlin.collections.ArrayList + +class OAuthManager { + + constructor() { + start() + } + + fun register(context: Context, url: String, listener: InstanceManager.InstanceListener) { + val args = Bundle() + args.putString(URL, url) + + val message = Message() + message.type = Message.Message_Type.REGISTER + message.context = context + message.args = args + message.listener = listener + + addMessage(message) + } + + fun getUserToken(context: Context, url: String, username: String, password: String, oauthData: OAuthData, listener: InstanceManager.InstanceListener) { + val args = Bundle() + args.putString(URL, url) + args.putParcelable(OAUTH_DATA, oauthData) + args.putString(USERNAME, username) + args.putString(PASSWORD, password) + + val message = Message() + message.type = Message.Message_Type.GET_USER_TOKEN + message.context = context + message.args = args + message.listener = listener + + addMessage(message) + } + + fun refreshToken(context: Context, url: String, oauthData: OAuthData, listener: InstanceManager.InstanceListener) { + val args = Bundle() + args.putString(URL, url) + args.putParcelable(OAUTH_DATA, oauthData) + + val message = Message() + message.type = Message.Message_Type.REFRESH_TOKEN + message.context = context + message.args = args + message.listener = listener + + addMessage(message) + } + + fun post(context: Context, url: String, oauthData: OAuthData, data: Bundle, listener: InstanceManager.InstanceListener) { + val args = Bundle() + args.putString(URL, url) + args.putParcelable(OAUTH_DATA, oauthData) + args.putBundle(DATA, data) + + val message = Message() + message.type = Message.Message_Type.POST + message.context = context + message.args = args + message.listener = listener + + addMessage(message) + } + + fun get(context: Context, url: String, oauthData: OAuthData?, listener: InstanceManager.InstanceListener) { + val args = Bundle() + args.putString(URL, url) + args.putParcelable(OAUTH_DATA, oauthData) + + val message = Message() + message.type = Message.Message_Type.GET + message.context = context + message.args = args + message.listener = listener + + addMessage(message) + } + + private companion object OAuthThread : Thread() { + private val messageQueue: ArrayList = ArrayList() + private val sem: Semaphore = Semaphore(0, true) + + private const val URL: String = "URL" + private const val USERNAME: String = "USERNAME" + private const val PASSWORD: String = "PASSWORD" + private const val OAUTH_DATA: String = "OAUTH_DATA" + private const val DATA: String = "DATA" + private const val EXTRA_DATA: String = "EXTRA_DATA" + private const val CONTENT_TYPE: String = "CONTENT_TYPE" + private const val CONTENT_DATA: String = "CONTENT_DATA" + + fun addMessage(message: Message) + { + messageQueue.add(message) + sem.release() + } + + override fun run() { + var isRunning = true + while (isRunning) { + try { + sem.acquire() + val mes: Message = messageQueue.removeAt(0) + when (mes.type) { + Message.Message_Type.REGISTER -> register(mes) + Message.Message_Type.GET_USER_TOKEN -> getUserToken(mes) + Message.Message_Type.REFRESH_TOKEN -> refreshToken(mes) + Message.Message_Type.POST -> post(mes) + Message.Message_Type.GET -> get(mes) + else -> {} + } + } catch (e: InterruptedException) { + isRunning = false + } + } + } + + fun register(message: Message) { + if (!isConnectedToInternet(message.context)) { + message.listener?.onError(message.context.getString(R.string.network_error)) + return + } + val url: String = message.args.getString(URL,"") + val registerUrl = URL(url) + val connection: HttpURLConnection = registerUrl.openConnection() as HttpURLConnection + connection.requestMethod = "GET" + connection.setRequestProperty("User-Agent", "Peeriscope") + connection.setRequestProperty("Content-Type", "application/json") + connection.setRequestProperty("Accept", "application/json") + connection.doInput = true + + var inputStream: InputStream + var inError = false + try { + inputStream = connection.inputStream + } catch (e: UnknownHostException) { + message.listener?.onError(message.context.getString(R.string.unknown_host)) + return + } catch (e : Exception) { + e.printStackTrace() + inputStream = connection.errorStream + inError = true + } + + val response = readInputStream(inputStream) + if(!inError) { + if(response.isNotEmpty()) { + val rootObj = JSONObject(response) + + val clientId = rootObj.getString("client_id") + val clientSecret = rootObj.getString("client_secret") + + val oauthData = OAuthData(null, null, clientId, clientSecret, null, null, 0, null,0) + val result = Bundle() + result.putParcelable(EXTRA_DATA, oauthData) + + message.listener?.onSuccess(result) + } else { + message.listener?.onError(message.context.getString(R.string.unknwon_error)) + } + } else { + if(response.isNotEmpty()) { + val rootObj = JSONObject(response) + val error = rootObj.getString("error") + message.listener?.onError(error) + } else { + message.listener?.onError(message.context.getString(R.string.unknwon_error)) + } + } + } + + fun getUserToken(message: Message) { + if (!isConnectedToInternet(message.context)) { + message.listener?.onError(message.context.getString(R.string.network_error)) + return + } + val url: String = message.args.getString(URL, "") + val getUserTokenUrl = URL(url) + val connection: HttpURLConnection = getUserTokenUrl.openConnection() as HttpURLConnection + connection.requestMethod = "POST" + connection.setRequestProperty("User-Agent", "Peeriscope") + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded") + connection.setRequestProperty("Accept", "application/json") + connection.doInput = true + connection.doOutput = true + + val oauth: OAuthData? = message.args.getParcelable(OAUTH_DATA) + if (BuildConfig.DEBUG && oauth == null) { + error("Missing OAUTH DATA") + } + val username: String = message.args.getString(USERNAME,"") + val password: String = message.args.getString(PASSWORD,"") + + var output = "" + output += "client_id=" + (oauth?.clientId ?: "") + output += "&client_secret=" + (oauth?.clientSecret ?: "") + output += "&grant_type=password" + output += "&response_type=code" + output += "&username=$username" + output += "&password=$password" + + val outputStream = connection.outputStream + outputStream.write(output.toByteArray()) + + var inputStream: InputStream + var inError = false + try { + inputStream = connection.inputStream + } catch (e: UnknownHostException) { + message.listener?.onError(message.context.getString(R.string.unknown_host)) + return + } catch (e : Exception) { + e.printStackTrace() + inputStream = connection.errorStream + inError = true + } + + val response = readInputStream(inputStream) + + if(!inError) { + if(response.isNotEmpty()) { + val rootObj = JSONObject(response) + + val accessToken = rootObj.getString("access_token") + val tokenType = rootObj.getString("token_type") + var expires = Calendar.getInstance().timeInMillis + expires += rootObj.getLong("expires_in")*1000 + + val refreshToken = rootObj.getString("refresh_token") + var refreshTokenExpires = Calendar.getInstance().timeInMillis + refreshTokenExpires += rootObj.getLong("refresh_token_expires_in")*1000 + + val oauthData = OAuthData(oauth?.baseUrl,username,oauth?.clientId, oauth?.clientSecret, accessToken, tokenType, expires, refreshToken, refreshTokenExpires) + val result = Bundle() + result.putParcelable(EXTRA_DATA, oauthData) + + message.listener?.onSuccess(result) + } else { + message.listener?.onError(message.context.getString(R.string.unknwon_error)) + } + } else { + if(response.isNotEmpty()) { + val rootObj = JSONObject(response) + val error = rootObj.getString("error") + message.listener?.onError(error) + } else { + message.listener?.onError(message.context.getString(R.string.unknwon_error)) + } + } + + } + + fun refreshToken(message: Message) { + if (!isConnectedToInternet(message.context)) { + message.listener?.onError(message.context.getString(R.string.network_error)) + return + } + val url: String = message.args.getString(URL, "") + val getUserTokenUrl = URL(url) + val connection: HttpURLConnection = getUserTokenUrl.openConnection() as HttpURLConnection + connection.requestMethod = "POST" + connection.setRequestProperty("User-Agent", "Peeriscope") + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded") + connection.setRequestProperty("Accept", "application/json") + connection.doInput = true + connection.doOutput = true + + val oauth: OAuthData? = message.args.getParcelable(OAUTH_DATA) + if (BuildConfig.DEBUG && oauth == null) { + error("Missing OAUTH DATA") + } + + var output = "" + output += "client_id=" + (oauth?.clientId ?: "") + output += "&client_secret=" + (oauth?.clientSecret ?: "") + output += "&grant_type=refresh_token" + output += "&response_type=code" + output += "&refresh_token=" +(oauth?.refreshToken?: "") + + val outputStream = connection.outputStream + outputStream.write(output.toByteArray()) + + var inputStream: InputStream + var inError = false + try { + inputStream = connection.inputStream + } catch (e: UnknownHostException) { + message.listener?.onError(message.context.getString(R.string.unknown_host)) + return + } catch (e : Exception) { + e.printStackTrace() + inputStream = connection.errorStream + inError = true + } + + val response = readInputStream(inputStream) + + if(!inError) { + if(response.isNotEmpty()) { + val rootObj = JSONObject(response) + + val accessToken = rootObj.getString("access_token") + val tokenType = rootObj.getString("token_type") + var expires = Calendar.getInstance().timeInMillis + expires += rootObj.getLong("expires_in")*1000 + val refreshToken = rootObj.getString("refresh_token") + var refreshTokenExpires = Calendar.getInstance().timeInMillis + refreshTokenExpires += rootObj.getLong("refresh_token_expires_in")*1000 + + val oauthData = OAuthData(oauth?.baseUrl,oauth?.username,oauth?.clientId, oauth?.clientSecret, accessToken, tokenType, expires, refreshToken, refreshTokenExpires) + val result = Bundle() + result.putParcelable(EXTRA_DATA, oauthData) + + message.listener?.onSuccess(result) + } else { + message.listener?.onError(message.context.getString(R.string.unknwon_error)) + } + } else { + if(response.isNotEmpty()) { + val rootObj = JSONObject(response) + val error = rootObj.getString("error") + message.listener?.onError(error) + } else { + message.listener?.onError(message.context.getString(R.string.unknwon_error)) + } + } + + } + + fun post(message: Message) { + if (!isConnectedToInternet(message.context)) { + message.listener?.onError(message.context.getString(R.string.network_error)) + return + } + val url: String = message.args.getString(URL, "") + val postUrl = URL(url) + val data = message.args.getBundle(DATA)!! + val connection: HttpURLConnection = postUrl.openConnection() as HttpURLConnection + connection.requestMethod = "POST" + connection.setRequestProperty("User-Agent", "Peeriscope") + connection.setRequestProperty("Content-Type", data.getString(CONTENT_TYPE,"application/json")) + connection.setRequestProperty("Accept", "application/json") + connection.doInput = true + connection.doOutput = true + + val oauth: OAuthData? = message.args.getParcelable(OAUTH_DATA) + if (BuildConfig.DEBUG && oauth == null) { + error("Missing OAUTH DATA") + } + val extraData: String = data.getString(CONTENT_DATA,"") + connection.setRequestProperty("Authorization","Bearer ${oauth?.accessToken}") + + var inputStream: InputStream? = null + val outputStream: OutputStream + var inError = false + try { + outputStream = connection.outputStream + outputStream.write(extraData.toByteArray()) + outputStream.flush() + outputStream.close() + } catch (e: UnknownHostException) { + message.listener?.onError(message.context.getString(R.string.unknown_host)) + return + } catch (e : Exception) { + e.printStackTrace() + inError = true + inputStream = connection.errorStream + } + + + if(!inError) { + try { + inputStream = connection.inputStream + } catch (e: UnknownHostException) { + message.listener?.onError(message.context.getString(R.string.unknown_host)) + return + } catch (e: Exception) { + e.printStackTrace() + inputStream = connection.errorStream + inError = true + } + } + if (inputStream != null) { + val response = readInputStream(inputStream) + if (!inError) { + if (response.isNotEmpty()) { + val result = Bundle() + result.putString(EXTRA_DATA, response) + message.listener?.onSuccess(result) + } else { + message.listener?.onError(message.context.getString(R.string.unknwon_error)) + } + } else { + if (response.isNotEmpty()) { + try { + val rootObj = JSONObject(response) + val error = rootObj.getString("error") + message.listener?.onError(error) + } catch (e: Exception) { + message.listener?.onError(message.context.getString(R.string.json_error)) + } + } else { + message.listener?.onError(message.context.getString(R.string.unknwon_error)) + } + } + } + } + + fun get(message: Message) { + if (!isConnectedToInternet(message.context)) { + message.listener?.onError(message.context.getString(R.string.network_error)) + return + } + val url: String = message.args.getString(URL, "") + val getUserTokenUrl = URL(url) + val connection: HttpURLConnection = getUserTokenUrl.openConnection() as HttpURLConnection + connection.requestMethod = "GET" + connection.setRequestProperty("User-Agent", "Peeriscope") + connection.setRequestProperty("Content-Type", "application/json") + connection.setRequestProperty("Accept", "application/json") + + connection.doInput = true + + val oauth: OAuthData? = message.args.getParcelable(OAUTH_DATA) + if (oauth != null) { + connection.setRequestProperty("Authorization", "Bearer ${oauth.accessToken}") + } + + var inputStream: InputStream + var inError = false + try { + inputStream = connection.inputStream + } catch (e: UnknownHostException) { + message.listener?.onError(message.context.getString(R.string.unknown_host)) + return + } catch (e : Exception) { + e.printStackTrace() + inputStream = connection.errorStream + inError = true + } + + val response = readInputStream(inputStream) + if(!inError) { + if(response.isNotEmpty()) { + val result = Bundle() + result.putString(EXTRA_DATA, response) + message.listener?.onSuccess(result) + } else { + message.listener?.onError(message.context.getString(R.string.unknwon_error)) + } + } else { + if(response.isNotEmpty()) { + try { + val rootObj = JSONObject(response) + val error = rootObj.getString("error") + message.listener?.onError(error) + } catch (e: Exception) { + message.listener?.onError(message.context.getString(R.string.json_error)) + } + } else { + message.listener?.onError(message.context.getString(R.string.unknwon_error)) + } + } + } + + + fun readInputStream(inputStream: InputStream) : String { + val inReader = InputStreamReader(inputStream) + val bufReader = BufferedReader(inReader) + var line: String? + var response = "" + + do { + line = bufReader.readLine() + if(line != null) + response += line + + }while (line != null) + + return response + } + + private fun isConnectedToInternet(context: Context): Boolean { + //verify the connectivity + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + val network = connectivityManager.activeNetwork + val capabilities = connectivityManager.getNetworkCapabilities(network) + if(capabilities != null) + return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) || capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) + } else { + val networkInfo = connectivityManager.activeNetworkInfo + if (networkInfo != null) + return networkInfo.isConnected + } + return false + } + } + + private class Message { + var type: Message_Type = Message_Type.UNKNOWN + var args = Bundle() + var listener: InstanceManager.InstanceListener? = null + lateinit var context: Context + + enum class Message_Type { + REGISTER, GET_USER_TOKEN, REFRESH_TOKEN, POST, GET, UNKNOWN + } + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/objects/ChannelData.kt b/app/src/main/java/fr/mobdev/peertubelive/objects/ChannelData.kt new file mode 100644 index 0000000..3156151 --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/objects/ChannelData.kt @@ -0,0 +1,32 @@ +package fr.mobdev.peertubelive.objects + +import android.os.Parcel +import android.os.Parcelable + +class ChannelData(val id: Long, val name: String?): Parcelable { + constructor(parcel: Parcel) : this( + parcel.readLong(), + parcel.readString() + ) { + } + + override fun describeContents(): Int { + return 0 + } + + override fun writeToParcel(dest: Parcel, flags: Int) { + dest.writeLong(id) + dest.writeString(name) + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): ChannelData { + return ChannelData(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/objects/OAuthData.kt b/app/src/main/java/fr/mobdev/peertubelive/objects/OAuthData.kt new file mode 100644 index 0000000..7413a6d --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/objects/OAuthData.kt @@ -0,0 +1,58 @@ +package fr.mobdev.peertubelive.objects + +import android.os.Parcel +import android.os.Parcelable + +class OAuthData(var baseUrl: String?, var username: String?, var clientId: String?, var clientSecret: String?, var accessToken: String?, var tokenType: String?, var expires: Long, var refreshToken: String?, var refreshTokenExpires: Long) : Parcelable { + constructor(parcel: Parcel) : this( + parcel.readString(), + parcel.readString(), + parcel.readString(), + parcel.readString(), + parcel.readString(), + parcel.readString(), + parcel.readLong(), + parcel.readString(), + parcel.readLong() + ) { + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(baseUrl) + parcel.writeString(username) + parcel.writeString(clientId) + parcel.writeString(clientSecret) + parcel.writeString(accessToken) + parcel.writeString(tokenType) + parcel.writeLong(expires) + parcel.writeString(refreshToken) + parcel.writeLong(refreshTokenExpires) + } + + override fun describeContents(): Int { + return 0 + } + + fun updateData(oAuthData: OAuthData){ + baseUrl = oAuthData.baseUrl + username = oAuthData.username + clientId = oAuthData.clientId + clientSecret = oAuthData.clientSecret + accessToken = oAuthData.accessToken + tokenType = oAuthData.tokenType + expires = oAuthData.expires + refreshToken = oAuthData.refreshToken + refreshTokenExpires = oAuthData.refreshTokenExpires + + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): OAuthData { + return OAuthData(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/objects/StreamData.kt b/app/src/main/java/fr/mobdev/peertubelive/objects/StreamData.kt new file mode 100644 index 0000000..1902324 --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/objects/StreamData.kt @@ -0,0 +1,32 @@ +package fr.mobdev.peertubelive.objects + +import android.os.Parcel +import android.os.Parcelable + +class StreamData(val url: String?, val key: String?): Parcelable { + constructor(parcel: Parcel) : this( + parcel.readString(), + parcel.readString() + ) { + } + + override fun describeContents(): Int { + return 0 + } + + override fun writeToParcel(dest: Parcel, flags: Int) { + dest.writeString(url) + dest.writeString(key) + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): StreamData { + return StreamData(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/objects/StreamSettings.kt b/app/src/main/java/fr/mobdev/peertubelive/objects/StreamSettings.kt new file mode 100644 index 0000000..0d82e12 --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/objects/StreamSettings.kt @@ -0,0 +1,55 @@ +package fr.mobdev.peertubelive.objects + +import android.os.Parcel +import android.os.Parcelable + +class StreamSettings( + val title: String, val channel: Long, val privacy: Int, val category: Int?, val language: String?, val licence: Int?, val description: String?, + val comments: Boolean, val download: Boolean, val nsfw: Boolean, val saveReplay: Boolean) : Parcelable { + constructor(parcel: Parcel) : this( + parcel.readString()!!, + parcel.readLong(), + parcel.readInt(), + parcel.readInt(), + parcel.readString(), + parcel.readInt(), + parcel.readString(), + parcel.readByte() != 0.toByte(), + parcel.readByte() != 0.toByte(), + parcel.readByte() != 0.toByte(), + parcel.readByte() != 0.toByte() + ) { + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(title) + parcel.writeLong(channel) + parcel.writeInt(privacy) + if (category != null) { + parcel.writeInt(category) + } + parcel.writeString(language) + if (licence != null) { + parcel.writeInt(licence) + } + parcel.writeString(description) + parcel.writeByte(if (comments) 1 else 0) + parcel.writeByte(if (download) 1 else 0) + parcel.writeByte(if (nsfw) 1 else 0) + parcel.writeByte(if (saveReplay) 1 else 0) + } + + override fun describeContents(): Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): StreamSettings { + return StreamSettings(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/mobdev/peertubelive/utils/TranslationUtils.kt b/app/src/main/java/fr/mobdev/peertubelive/utils/TranslationUtils.kt new file mode 100644 index 0000000..cd494dc --- /dev/null +++ b/app/src/main/java/fr/mobdev/peertubelive/utils/TranslationUtils.kt @@ -0,0 +1,271 @@ +package fr.mobdev.peertubelive.utils + +import fr.mobdev.peertubelive.R + +class TranslationUtils { + companion object { + private val categoryMap: Map = mapOf( + "Music" to R.string.music, + "Films" to R.string.films, + "Vehicles" to R.string.vehicles, + "Art" to R.string.art, + "Sports" to R.string.sports, + "Travels" to R.string.travels, + "Gaming" to R.string.gaming, + "People" to R.string.people, + "Comedy" to R.string.comedy, + "Entertainment" to R.string.entertainment, + "News & Politics" to R.string.news_politics, + "How To" to R.string.how_to, + "Education" to R.string.education, + "Activism" to R.string.activism, + "Science & Technology" to R.string.science_tech, + "Animals" to R.string.animals, + "Kids" to R.string.kids, + "Food" to R.string.food + ) + + fun getCategoryTranslationFor(category: String):Int { + return if (categoryMap.containsKey(category)) + categoryMap[category]!! + else + -1 + } + + private val licenceMap: Map = mapOf( + "Attribution" to R.string.by, + "Attribution - Share Alike" to R.string.bysa, + "Attribution - No Derivatives" to R.string.bynd, + "Attribution - Non Commercial" to R.string.bync, + "Attribution - Non Commercial - Share Alike" to R.string.byncsa, + "Attribution - Non Commercial - No Derivatives" to R.string.byncnd, + "Public Domain Dedication" to R.string.public_domain + ) + + fun getLicenceTranslationFor(licence: String):Int { + return if (licenceMap.containsKey(licence)) + licenceMap[licence]!! + else + -1 + } + + private val privacyMap: Map = mapOf( + "Public" to R.string.privacy_public, + "Private" to R.string.privacy_private, + "Internal" to R.string.internal, + "Unlisted" to R.string.unlisted + ) + + fun getPrivacyTranslationFor(privacy: String):Int { + return if (privacyMap.containsKey(privacy)) + privacyMap[privacy]!! + else + -1 + } + + private val languageMap: Map = mapOf( + "Afar" to R.string.afar, + "Abkhazian" to R.string.abkhazian, + "Afrikaans" to R.string.afrikaans, + "Akan" to R.string.akan, + "Amharic" to R.string.amharic, + "Arabic" to R.string.arabic, + "Aragonese" to R.string.aragonese, + "American Sign Language" to R.string.american_sign_language, + "Assamese" to R.string.assamese, + "Avaric" to R.string.avaric, + "Kotava" to R.string.kotava, + "Aymara" to R.string.aymara, + "Azerbaijani" to R.string.azerbaijani, + "Bashkir" to R.string.bashkir, + "Bambara" to R.string.bambara, + "Belarusian" to R.string.belarusian, + "Bengali" to R.string.bengali, + "British Sign Language" to R.string.british_sign_language, + "Bislama" to R.string.bislama, + "Tibetan" to R.string.tibetan, + "Bosnian" to R.string.bosnian, + "Breton" to R.string.breton, + "Bulgarian" to R.string.bulgarian, + "Brazilian Sign Language" to R.string.brazilian_sign_language, + "Catalan" to R.string.catalan, + "Czech" to R.string.czech, + "Chamorro" to R.string.chamorro, + "Chechen" to R.string.chechen, + "Chuvash" to R.string.chuvash, + "Cornish" to R.string.cornish, + "Corsican" to R.string.corsican, + "Cree" to R.string.cree, + "Czech Sign Language" to R.string.czech_sign_language, + "Chinese Sign Language" to R.string.chinese_sign_language, + "Welsh" to R.string.welsh, + "Danish" to R.string.danish, + "German" to R.string.german, + "Dhivehi" to R.string.dhivehi, + "Danish Sign Language" to R.string.danish_sign_language, + "Dzongkha" to R.string.dzongkha, + "Greek" to R.string.greek, + "English" to R.string.english, + "Esperanto" to R.string.esperanto, + "Estonian" to R.string.estonian, + "Basque" to R.string.basque, + "Ewe" to R.string.ewe, + "Faroese" to R.string.faroese, + "Persian" to R.string.persian, + "Fijian" to R.string.fijian, + "Finnish" to R.string.finnish, + "French" to R.string.french, + "Western Frisian" to R.string.western_frisian, + "French Sign Language" to R.string.french_sign_language, + "Fulah" to R.string.fulah, + "Scottish Gaelic" to R.string.scottish_gaelic, + "Irish" to R.string.irish, + "Galician" to R.string.galician, + "Manx" to R.string.manx, + "Guarani" to R.string.guarani, + "German Sign Language" to R.string.german_sign_language, + "Gujarati" to R.string.gujarati, + "Haitian" to R.string.haitian, + "Hausa" to R.string.hausa, + "Serbo-Croatian" to R.string.serbo_croatian, + "Hebrew" to R.string.hebrew, + "Herero" to R.string.herero, + "Hindi" to R.string.hindi, + "Hiri Motu" to R.string.hiri_motu, + "Croatian" to R.string.croatian, + "Hungarian" to R.string.hungarian, + "Armenian" to R.string.armenian, + "Igbo" to R.string.igbo, + "Sichuan Yi" to R.string.sichuan_yi, + "Inuktitut" to R.string.inuktitut, + "Indonesian" to R.string.indonesian, + "Inupiaq" to R.string.inupiaq, + "Icelandic" to R.string.icelandic, + "Italian" to R.string.italian, + "Javanese" to R.string.javanese, + "Lojban" to R.string.lojban, + "Japanese" to R.string.japanese, + "Japanese Sign Language" to R.string.japanese_sign_language, + "Kabyle" to R.string.kabyle, + "Kalaallisut" to R.string.kalaallisut, + "Kannada" to R.string.kannada, + "Kashmiri" to R.string.kashmiri, + "Georgian" to R.string.georgian, + "Kanuri" to R.string.kanuri, + "Kazakh" to R.string.kazakh, + "Khmer" to R.string.khmer, + "Kikuyu" to R.string.kikuyu, + "Kinyarwanda" to R.string.kinyarwanda, + "Kirghiz" to R.string.kirghiz, + "Komi" to R.string.komi, + "Kongo" to R.string.kongo, + "Korean" to R.string.korean, + "Kuanyama" to R.string.kuanyama, + "Kurdish" to R.string.kurdish, + "Lao" to R.string.lao, + "Latvian" to R.string.latvian, + "Limburgan" to R.string.limburgan, + "Lingala" to R.string.lingala, + "Lithuanian" to R.string.lithuanian, + "Luxembourgish" to R.string.luxembourgish, + "Luba-Katanga" to R.string.luba_katanga, + "Ganda" to R.string.ganda, + "Marshallese" to R.string.marshallese, + "Malayalam" to R.string.malayalam, + "Marathi" to R.string.marathi, + "Macedonian" to R.string.macedonian, + "Malagasy" to R.string.malagasy, + "Maltese" to R.string.maltese, + "Mongolian" to R.string.mongolian, + "Maori" to R.string.maori, + "Malay (macrolanguage)" to R.string.malay_macrolanguage, + "Burmese" to R.string.burmese, + "Nauru" to R.string.nauru, + "Navajo" to R.string.navajo, + "South Ndebele" to R.string.south_ndebele, + "North Ndebele" to R.string.north_ndebele, + "Ndonga" to R.string.ndonga, + "Nepali (macrolanguage)" to R.string.nepali_macrolanguage, + "Dutch" to R.string.dutch, + "Norwegian Nynorsk" to R.string.norwegian_nynorsk, + "Norwegian Bokmål" to R.string.norwegian_bokmål, + "Norwegian" to R.string.norwegian, + "Nyanja" to R.string.nyanja, + "Occitan" to R.string.occitan, + "Ojibwa" to R.string.ojibwa, + "Oriya (macrolanguage)" to R.string.oriya_macrolanguage, + "Oromo" to R.string.oromo, + "Ossetian" to R.string.ossetian, + "Panjabi" to R.string.panjabi, + "Pakistan Sign Language" to R.string.pakistan_sign_language, + "Polish" to R.string.polish, + "Portuguese" to R.string.portuguese, + "Pushto" to R.string.pushto, + "Quechua" to R.string.quechua, + "Romansh" to R.string.romansh, + "Romanian" to R.string.romanian, + "Russian Sign Language" to R.string.russian_sign_language, + "Rundi" to R.string.rundi, + "Russian" to R.string.russian, + "Sango" to R.string.sango, + "Saudi Arabian Sign Language" to R.string.saudi_arabian_sign_language, + "South African Sign Language" to R.string.south_african_sign_language, + "Sinhala" to R.string.sinhala, + "Slovak" to R.string.slovak, + "Slovenian" to R.string.slovenian, + "Northern Sami" to R.string.northern_sami, + "Samoan" to R.string.samoan, + "Shona" to R.string.shona, + "Sindhi" to R.string.sindhi, + "Somali" to R.string.somali, + "Southern Sotho" to R.string.southern_sotho, + "Spanish" to R.string.spanish, + "Albanian" to R.string.albanian, + "Sardinian" to R.string.sardinian, + "Serbian" to R.string.serbian, + "Swati" to R.string.swati, + "Sundanese" to R.string.sundanese, + "Swahili (macrolanguage)" to R.string.swahili_macrolanguage, + "Swedish" to R.string.swedish, + "Swedish Sign Language" to R.string.swedish_sign_language, + "Tahitian" to R.string.tahitian, + "Tamil" to R.string.tamil, + "Tatar" to R.string.tatar, + "Telugu" to R.string.telugu, + "Tajik" to R.string.tajik, + "Tagalog" to R.string.tagalog, + "Thai" to R.string.thai, + "Tigrinya" to R.string.tigrinya, + "Klingon" to R.string.klingon, + "Tonga (Tonga Islands)" to R.string.tonga_tonga_islands, + "Tswana" to R.string.tswana, + "Tsonga" to R.string.tsonga, + "Turkmen" to R.string.turkmen, + "Turkish" to R.string.turkish, + "Twi" to R.string.twi, + "Uighur" to R.string.uighur, + "Ukrainian" to R.string.ukrainian, + "Urdu" to R.string.urdu, + "Uzbek" to R.string.uzbek, + "Venda" to R.string.venda, + "Vietnamese" to R.string.vietnamese, + "Walloon" to R.string.walloon, + "Wolof" to R.string.wolof, + "Xhosa" to R.string.xhosa, + "Yiddish" to R.string.yiddish, + "Yoruba" to R.string.yoruba, + "Zhuang" to R.string.zhuang, + "Chinese" to R.string.chinese, + "Zulu" to R.string.zulu + ) + + fun getLanguageTranslationFor(language: String):Int { + return if (languageMap.containsKey(language)) + languageMap[language]!! + else + -1 + } + + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_cameraswitch_24.xml b/app/src/main/res/drawable/baseline_cameraswitch_24.xml new file mode 100644 index 0000000..6264f1a --- /dev/null +++ b/app/src/main/res/drawable/baseline_cameraswitch_24.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_flash_off_24.xml b/app/src/main/res/drawable/baseline_flash_off_24.xml new file mode 100644 index 0000000..61f2e83 --- /dev/null +++ b/app/src/main/res/drawable/baseline_flash_off_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/baseline_flash_on_24.xml b/app/src/main/res/drawable/baseline_flash_on_24.xml new file mode 100644 index 0000000..168d13a --- /dev/null +++ b/app/src/main/res/drawable/baseline_flash_on_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/baseline_navigate_next_24.xml b/app/src/main/res/drawable/baseline_navigate_next_24.xml new file mode 100644 index 0000000..d060b80 --- /dev/null +++ b/app/src/main/res/drawable/baseline_navigate_next_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/baseline_screen_lock_rotation_24.xml b/app/src/main/res/drawable/baseline_screen_lock_rotation_24.xml new file mode 100644 index 0000000..e90edd9 --- /dev/null +++ b/app/src/main/res/drawable/baseline_screen_lock_rotation_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/baseline_screen_rotation_24.xml b/app/src/main/res/drawable/baseline_screen_rotation_24.xml new file mode 100644 index 0000000..9b38464 --- /dev/null +++ b/app/src/main/res/drawable/baseline_screen_rotation_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/baseline_videocam_24.xml b/app/src/main/res/drawable/baseline_videocam_24.xml new file mode 100644 index 0000000..340bff2 --- /dev/null +++ b/app/src/main/res/drawable/baseline_videocam_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/baseline_videocam_off_24.xml b/app/src/main/res/drawable/baseline_videocam_off_24.xml new file mode 100644 index 0000000..7977a64 --- /dev/null +++ b/app/src/main/res/drawable/baseline_videocam_off_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/baseline_volume_off_24.xml b/app/src/main/res/drawable/baseline_volume_off_24.xml new file mode 100644 index 0000000..3038cfd --- /dev/null +++ b/app/src/main/res/drawable/baseline_volume_off_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/baseline_volume_up_24.xml b/app/src/main/res/drawable/baseline_volume_up_24.xml new file mode 100644 index 0000000..cc288cd --- /dev/null +++ b/app/src/main/res/drawable/baseline_volume_up_24.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_add_24.xml b/app/src/main/res/drawable/ic_baseline_add_24.xml new file mode 100644 index 0000000..eb23254 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_add_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_broadcast_24.xml b/app/src/main/res/drawable/ic_baseline_broadcast_24.xml new file mode 100644 index 0000000..26c40a6 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_broadcast_24.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..ca3826a --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/add_instance.xml b/app/src/main/res/layout/add_instance.xml new file mode 100644 index 0000000..9f31b3b --- /dev/null +++ b/app/src/main/res/layout/add_instance.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/channel_list.xml b/app/src/main/res/layout/channel_list.xml new file mode 100644 index 0000000..5b42f14 --- /dev/null +++ b/app/src/main/res/layout/channel_list.xml @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/home.xml b/app/src/main/res/layout/home.xml new file mode 100644 index 0000000..f871f80 --- /dev/null +++ b/app/src/main/res/layout/home.xml @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/instance_item.xml b/app/src/main/res/layout/instance_item.xml new file mode 100644 index 0000000..9ff71f5 --- /dev/null +++ b/app/src/main/res/layout/instance_item.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/stream.xml b/app/src/main/res/layout/stream.xml new file mode 100644 index 0000000..2743f88 --- /dev/null +++ b/app/src/main/res/layout/stream.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/home.xml b/app/src/main/res/menu/home.xml new file mode 100644 index 0000000..588edb9 --- /dev/null +++ b/app/src/main/res/menu/home.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..c4a603d --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..c4a603d --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..f2dfb10 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..43e0d3b Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..bf33e5a Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..c0f3063 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..cb9c6b0 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..42c12c2 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..829f63c Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..650f732 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..902205a Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..e30641d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d4e704a Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..9296905 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..eb3f8b1 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..4df860f Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..8df8f07 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml new file mode 100644 index 0000000..024031f --- /dev/null +++ b/app/src/main/res/values-fr/strings.xml @@ -0,0 +1,289 @@ + + Peertube Live + + + Aucune connexion internet détecté + Error Inconnu + Hôte Inconnu + Erreur JSON + Le titre ne peut pas être vide + L\'instance ne peut pas être vide + Le nom d\'utilisateur ne peut pas être vide + Le mot de passe ne peut pas être vide + L\'instance doit avoir une url valide + Ce compte existe déjà + + + Aucun compte enregistré. Pour ajouter un compte peertube, cliquez sur le \'+\' dans la top bar + Chargement de la liste de vos chaîne + En attente de connexion + Nous avons besoin d\'accéder à la caméra et au micro pour le direct. Pour changer les paramètres de permission, cliquez en dessous + Êtes vous sure de vouloir supprimer le compte %s associé au serveur %s ? + Maximum 5 tags, Chacun entre 2 et 30 caractères, séparé par une virgule + Si vous activez cette option, votre direct sera arrêté si vous dépassez votre quota vidéo + Direct terminé après que vous ayez appuyé sur la touche retour + Direct terminé car l\'application est passé à l\'arrière plan + Direct terminé car le téléphone a été verrouillé + Voulez vous arrêter le direct? + + + + Chaîne + Démarrer le direct! + Annuler + Oui + Non + Aller dans les paramètres + Connecter + + + Titre + Categorie + Visibilité + Langue + Licence + ▶ Paramètres Avancées + ▼ Paramètres Avancées + Ajouter ce compte + Nom d\'utilisateur + Mot de passe + Instance + Supprimer ce compte + Activer les commentaires + Activer le téléchargement + Contient du contenu sensible + Tags + Description + Publier une rediffusion automatiquement à la fin du direct + Direct terminé + Arrêter le direct + + + Musiques + Films + Vehicules + Art + Sports + Voyages + Jeux Vidéos + Personnalités + Humour + Divertissement + Actualité & Politique + Tutoriels + Éducation + Militantisme + Science & Technologie + Animaux + Enfants + Cuisine + + Afar + Abkhaze + Afrikaans + Akan + Amharique + Arabe + Aragonais + Langue des signes américaine + Assamais + Avar + Kotava + Aymara + Azéri + Bachkir + Bambara + Biélorusse + Bengali + Langue des signes britannique + Bichlamar + Tibétain + Bosniaque + Breton + Bulgare + Langue des signes brésilienne + Catalan + Tchèque + Chamorro + Tchétchène + Tchouvache + Cornique + Corse + Cree + Langue des signes tchèque + Langue des signes chinoise + Gallois + Danois + Allemand + Maldivien + Langue des signes danoise + Dzongkha + Grec + Anglais + Espéranto + Estonien + Basque + Éwé + Féroïen + Persan + Fidjien + Finnois + Français + Frison occidental + Langue des signes française + Peul + Gaélique + Irlandais + Galicien + Manx + Guarani + Langue des signes allemande + Goudjrati + Haïtien + Haoussa + Serbo-croate + Hébreu + Herero + Hindi + Hiri motu + Croate + Hongrois + Arménien + Igbo + Yi de Sichuan + Inuktitut + Indonésien + Inupiaq + Islandais + Italien + Javanais + Lojban + Japonais + Langue des signes japonaise + Kabyle + Groenlandais + Kannada + Kashmiri + Géorgien + Kanouri + Kazakh + Khmer central + Kikuyu + Rwanda + Kirghiz + Kom + Kongo + Coréen + Kuanyama + Kurde + Lao + Letton + Limbourgeois + Lingala + Lituanien + Luxembourgeois + Luba-katanga + Ganda + Marshall + Malayalam + Marathe + Macédonien + Malgache + Maltais + Mongol + Maori + Malais + Birman + Nauruan + Navaho + Ndébélé du Sud + Ndébélé du Nord + Ndonga + Népalais + Néerlandais + Norvégien nynorsk + Norvégien bokmål + Norvégien + Chichewa + Occitane + Ojibwa + Oriya + Galla + Ossète + Pendjabi + Langue des signes pakistanaise + Polonais + Portugais + Pachto + Quechua + Romanche + Roumain + Langue des signes russe + Rundi + Russe + Sango + Langue des signes saoudienne + Langue des signes sud-africaine + Singhalais + Slovaque + Slovène + Sami du Nord + Samoan + Shona + Sindhi + Somali + Sotho du Sud + Espagnol + Albanais + Sarde + Serbe + Swati + Soundanais + Swahili + Suédois + Langue des signes suédoise + Tahitien + Tamoul + Tatar + Télougou + Tadjik + Tagalog + Thaï + Tigrigna + Klingon + Tongan (Îles Tonga) + Tswana + Tsonga + Turkmène + Turc + Twi + Ouïgour + Ukrainien + Ourdou + Ouszbek + Venda + Vietnamien + Wallon + Wolof + Xhosa + Yiddish + Yoruba + Zhuang + Chinois + Zoulou + + + Attribution> + Attribution - Partage dans les mêmes conditions + Attribution - Pas d\'œuvre dérivée + Attribution - Utilisation non commerciale + Attribution - Utilisation non commerciale - Partage dans les mêmes conditions + Attribution - Utilisation non commerciale - Pas d\'œuvre dérivée + Domaine Publique + + + Publique + Non Listée + Privée + Interne + \ No newline at end of file diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml new file mode 100644 index 0000000..dfae120 --- /dev/null +++ b/app/src/main/res/values-night/colors.xml @@ -0,0 +1,9 @@ + + + + #202020 + #202020 + #F2690D + #000000 + #FFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..686a62a --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,19 @@ + + + + #F2690D + #B83900 + #202020 + #FFFFFF + #FFFFFF + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..125df87 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,3 @@ + + 16dp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..4b32302 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,289 @@ + + Peertube Live + + + No Internet Connection Found + Unknown Error + Unknown Host + JSON Error + Title should not be empty + Instance cannot be empty + Username cannot be empty + Password cannot be empty + Instance should be a valid url + This account already exist + + + No account registered. To add a peertube account, click on the \'+\' in the top bar + Loading your channel list + Waiting for connection + We need the access to the camera and microphone to live stream. To change permissions settings click below + Are you sure you want to delete the account %s associated with the server %s ? + Maximum 5 tags, each between 2 and 30 characters, separate by comma + If you enable this option, your live will be terminated if you exceed your video quota + Live has stop after you pressed back button + Live has stop because the app has gone to background + Live has stop because the phone was locked + Do you want to stop the live? + + + Channel + Go Live! + Cancel + Yes + No + View settings + Connect + + + Title + Category + Privacy + Language + Licence + ▶ Advanced Settings + ▼ Advanced Settings + Add this account + Username + Password + Instance + Delete this account + Enable video comments + Enable download + Contains sensitive content + Tags + Description + Automatically publish a replay when your live ends + Live ended + Stop the live + + + Music + Films + Vehicles + Art + Sports + Travels + Gaming + People + Comedy + Entertainment + News & Politics + How To + Education + Activism + Science & Technology + Animals + Kids + Food + + + Afar + Abkhazian + Afrikaans + Akan + Amharic + Arabic + Aragonese + American Sign Language + Assamese + Avaric + Kotava + Aymara + Azerbaijani + Bashkir + Bambara + Belarusian + Bengali + British Sign Language + Bislama + Tibetan + Bosnian + Breton + Bulgarian + Brazilian Sign Language + Catalan + Czech + Chamorro + Chechen + Chuvash + Cornish + Corsican + Cree + Czech Sign Language + Chinese Sign Language + Welsh + Danish + German + Dhivehi + Danish Sign Language + Dzongkha + Greek + English + Esperanto + Estonian + Basque + Ewe + Faroese + Persian + Fijian + Finnish + French + Western Frisian + French Sign Language + Fulah + Scottish Gaelic + Irish + Galician + Manx + Guarani + German Sign Language + Gujarati + Haitian + Hausa + Serbo-Croatian + Hebrew + Herero + Hindi + Hiri Motu + Croatian + Hungarian + Armenian + Igbo + Sichuan Yi + Inuktitut + Indonesian + Inupiaq + Icelandic + Italian + Javanese + Lojban + Japanese + Japanese Sign Language + Kabyle + Kalaallisut + Kannada + Kashmiri + Georgian + Kanuri + Kazakh + Khmer + Kikuyu + Kinyarwanda + Kirghiz + Komi + Kongo + Korean + Kuanyama + Kurdish + Lao + Latvian + Limburgan + Lingala + Lithuanian + Luxembourgish + Luba-Katanga + Ganda + Marshallese + Malayalam + Marathi + Macedonian + Malagasy + Maltese + Mongolian + Maori + Malay (macrolanguage) + Burmese + Nauru + Navajo + South Ndebele + North Ndebele + Ndonga + Nepali (macrolanguage) + Dutch + Norwegian Nynorsk + Norwegian Bokmål + Norwegian + Nyanja + Occitan + Ojibwa + Oriya (macrolanguage) + Oromo + Ossetian + Panjabi + Pakistan Sign Language + Polish + Portuguese + Pushto + Quechua + Romansh + Romanian + Russian Sign Language + Rundi + Russian + Sango + Saudi Arabian Sign Language + South African Sign Language + Sinhala + Slovak + Slovenian + Northern Sami + Samoan + Shona + Sindhi + Somali + Southern Sotho + Spanish + Albanian + Sardinian + Serbian + Swati + Sundanese + Swahili (macrolanguage) + Swedish + Swedish Sign Language + Tahitian + Tamil + Tatar + Telugu + Tajik + Tagalog + Thai + Tigrinya + Klingon + Tonga (Tonga Islands) + Tswana + Tsonga + Turkmen + Turkish + Twi + Uighur + Ukrainian + Urdu + Uzbek + Venda + Vietnamese + Walloon + Wolof + Xhosa + Yiddish + Yoruba + Zhuang + Chinese + Zulu + + + Attribution> + Attribution - Share Alike + Attribution - No Derivatives + Attribution - Non Commercial + Attribution - Non Commercial - Share Alike + Attribution - Non Commercial - No Derivatives + Public Domain Dedication + + + Public + Unlisted + Private + Internal + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..99dec3a --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/app/src/test/java/fr/mobdev/peertubelive/ExampleUnitTest.kt b/app/src/test/java/fr/mobdev/peertubelive/ExampleUnitTest.kt new file mode 100644 index 0000000..8f0e8be --- /dev/null +++ b/app/src/test/java/fr/mobdev/peertubelive/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package org.framasoft.peertubelive + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..2109ef3 --- /dev/null +++ b/build.gradle @@ -0,0 +1,28 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + ext.kotlin_version = '1.5.10' + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:4.2.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + maven { url 'https://jitpack.io' } + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/encoder/.gitignore b/encoder/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/encoder/.gitignore @@ -0,0 +1 @@ +/build diff --git a/encoder/build.gradle b/encoder/build.gradle new file mode 100644 index 0000000..900aaf2 --- /dev/null +++ b/encoder/build.gradle @@ -0,0 +1,22 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 30 + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 30 + versionCode 182 + versionName "1.8.2" + } + buildTypes { + release { + minifyEnabled false + consumerProguardFiles 'proguard-rules.pro' + } + } +} + +dependencies { + api 'androidx.annotation:annotation:1.2.0' +} diff --git a/encoder/proguard-rules.pro b/encoder/proguard-rules.pro new file mode 100644 index 0000000..3347674 --- /dev/null +++ b/encoder/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /home/pedro/Android/Sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/encoder/src/main/AndroidManifest.xml b/encoder/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d21c457 --- /dev/null +++ b/encoder/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/encoder/src/main/java/com/pedro/encoder/BaseEncoder.java b/encoder/src/main/java/com/pedro/encoder/BaseEncoder.java new file mode 100644 index 0000000..c830f5e --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/BaseEncoder.java @@ -0,0 +1,125 @@ +package com.pedro.encoder; + +import android.media.MediaCodec; +import android.media.MediaCodecInfo; +import android.media.MediaFormat; +import android.os.Build; +import androidx.annotation.NonNull; +import com.pedro.encoder.utils.CodecUtil; +import java.nio.ByteBuffer; + +/** + * Created by pedro on 18/09/19. + */ +public abstract class BaseEncoder implements EncoderCallback { + + private static final String TAG = "BaseEncoder"; + private MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); + protected MediaCodec codec; + protected long presentTimeUs; + protected volatile boolean running = false; + protected boolean isBufferMode = true; + protected CodecUtil.Force force = CodecUtil.Force.FIRST_COMPATIBLE_FOUND; + + public void start() { + start(true); + } + + public abstract void start(boolean resetTs); + + protected abstract void stopImp(); + + public void stop() { + running = false; + stopImp(); + try { + codec.stop(); + codec.release(); + codec = null; + } catch (IllegalStateException | NullPointerException e) { + codec = null; + } + } + + protected abstract MediaCodecInfo chooseEncoder(String mime); + + protected void getDataFromEncoder(Frame frame) throws IllegalStateException { + if (isBufferMode) { + int inBufferIndex = codec.dequeueInputBuffer(0); + if (inBufferIndex >= 0) { + inputAvailable(codec, inBufferIndex, frame); + } + } + for (; running; ) { + int outBufferIndex = codec.dequeueOutputBuffer(bufferInfo, 0); + if (outBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { + MediaFormat mediaFormat = codec.getOutputFormat(); + formatChanged(codec, mediaFormat); + } else if (outBufferIndex >= 0) { + outputAvailable(codec, outBufferIndex, bufferInfo); + } else { + break; + } + } + } + + protected abstract Frame getInputFrame() throws InterruptedException; + + private void processInput(@NonNull ByteBuffer byteBuffer, @NonNull MediaCodec mediaCodec, + int inBufferIndex, Frame frame) throws IllegalStateException { + try { + if (frame == null) frame = getInputFrame(); + byteBuffer.clear(); + byteBuffer.put(frame.getBuffer(), frame.getOffset(), frame.getSize()); + long pts = System.nanoTime() / 1000 - presentTimeUs; + mediaCodec.queueInputBuffer(inBufferIndex, 0, frame.getSize(), pts, 0); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + protected abstract void checkBuffer(@NonNull ByteBuffer byteBuffer, + @NonNull MediaCodec.BufferInfo bufferInfo); + + protected abstract void sendBuffer(@NonNull ByteBuffer byteBuffer, + @NonNull MediaCodec.BufferInfo bufferInfo); + + private void processOutput(@NonNull ByteBuffer byteBuffer, @NonNull MediaCodec mediaCodec, + int outBufferIndex, @NonNull MediaCodec.BufferInfo bufferInfo) throws IllegalStateException { + checkBuffer(byteBuffer, bufferInfo); + sendBuffer(byteBuffer, bufferInfo); + mediaCodec.releaseOutputBuffer(outBufferIndex, false); + } + + public void setForce(CodecUtil.Force force) { + this.force = force; + } + + public boolean isRunning() { + return running; + } + + @Override + public void inputAvailable(@NonNull MediaCodec mediaCodec, int inBufferIndex, Frame frame) + throws IllegalStateException { + ByteBuffer byteBuffer; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + byteBuffer = mediaCodec.getInputBuffer(inBufferIndex); + } else { + byteBuffer = mediaCodec.getInputBuffers()[inBufferIndex]; + } + processInput(byteBuffer, mediaCodec, inBufferIndex, frame); + } + + @Override + public void outputAvailable(@NonNull MediaCodec mediaCodec, int outBufferIndex, + @NonNull MediaCodec.BufferInfo bufferInfo) throws IllegalStateException { + ByteBuffer byteBuffer; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + byteBuffer = mediaCodec.getOutputBuffer(outBufferIndex); + } else { + byteBuffer = mediaCodec.getOutputBuffers()[outBufferIndex]; + } + processOutput(byteBuffer, mediaCodec, outBufferIndex, bufferInfo); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/EncoderCallback.java b/encoder/src/main/java/com/pedro/encoder/EncoderCallback.java new file mode 100644 index 0000000..e657528 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/EncoderCallback.java @@ -0,0 +1,18 @@ +package com.pedro.encoder; + +import android.media.MediaCodec; +import android.media.MediaFormat; +import androidx.annotation.NonNull; + +/** + * Created by pedro on 18/09/19. + */ +public interface EncoderCallback { + void inputAvailable(@NonNull MediaCodec mediaCodec, int inBufferIndex, Frame frame) + throws IllegalStateException; + + void outputAvailable(@NonNull MediaCodec mediaCodec, int outBufferIndex, + @NonNull MediaCodec.BufferInfo bufferInfo) throws IllegalStateException; + + void formatChanged(@NonNull MediaCodec mediaCodec, @NonNull MediaFormat mediaFormat); +} diff --git a/encoder/src/main/java/com/pedro/encoder/Frame.java b/encoder/src/main/java/com/pedro/encoder/Frame.java new file mode 100644 index 0000000..f2edf56 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/Frame.java @@ -0,0 +1,86 @@ +package com.pedro.encoder; + +import android.graphics.ImageFormat; + +/** + * Created by pedro on 17/02/18. + */ + +public class Frame { + + private byte[] buffer; + private int offset; + private int size; + private int orientation; + private boolean flip; + private int format = ImageFormat.NV21; //nv21 or yv12 supported + + /** + * Used with video frame + */ + public Frame(byte[] buffer, int orientation, boolean flip, int format) { + this.buffer = buffer; + this.orientation = orientation; + this.flip = flip; + this.format = format; + offset = 0; + size = buffer.length; + } + + /** + * Used with audio frame + */ + public Frame(byte[] buffer, int offset, int size) { + this.buffer = buffer; + this.offset = offset; + this.size = size; + } + + public byte[] getBuffer() { + return buffer; + } + + public void setBuffer(byte[] buffer) { + this.buffer = buffer; + } + + public int getOrientation() { + return orientation; + } + + public void setOrientation(int orientation) { + this.orientation = orientation; + } + + public boolean isFlip() { + return flip; + } + + public void setFlip(boolean flip) { + this.flip = flip; + } + + public int getFormat() { + return format; + } + + public void setFormat(int format) { + this.format = format; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/audio/AudioEncoder.java b/encoder/src/main/java/com/pedro/encoder/audio/AudioEncoder.java new file mode 100644 index 0000000..f98c688 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/audio/AudioEncoder.java @@ -0,0 +1,163 @@ +package com.pedro.encoder.audio; + +import android.media.MediaCodec; +import android.media.MediaCodecInfo; +import android.media.MediaFormat; +import android.util.Log; +import androidx.annotation.NonNull; +import com.pedro.encoder.BaseEncoder; +import com.pedro.encoder.Frame; +import com.pedro.encoder.input.audio.GetMicrophoneData; +import com.pedro.encoder.utils.CodecUtil; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by pedro on 19/01/17. + * + * Encode PCM audio data to ACC and return in a callback + */ + +public class AudioEncoder extends BaseEncoder implements GetMicrophoneData { + + private static final String TAG = "AudioEncoder"; + + private GetAacData getAacData; + private int bitRate = 64 * 1024; //in kbps + private int sampleRate = 32000; //in hz + private boolean isStereo = true; + + public AudioEncoder(GetAacData getAacData) { + this.getAacData = getAacData; + } + + /** + * Prepare encoder with custom parameters + */ + public boolean prepareAudioEncoder(int bitRate, int sampleRate, boolean isStereo, + int maxInputSize) { + this.sampleRate = sampleRate; + isBufferMode = true; + try { + List encoders = new ArrayList<>(); + if (force == CodecUtil.Force.HARDWARE) { + encoders = CodecUtil.getAllHardwareEncoders(CodecUtil.AAC_MIME); + } else if (force == CodecUtil.Force.SOFTWARE) { + encoders = CodecUtil.getAllSoftwareEncoders(CodecUtil.AAC_MIME); + } + + if (force == CodecUtil.Force.FIRST_COMPATIBLE_FOUND) { + MediaCodecInfo encoder = chooseEncoder(CodecUtil.AAC_MIME); + if (encoder != null) { + codec = MediaCodec.createByCodecName(encoder.getName()); + } else { + Log.e(TAG, "Valid encoder not found"); + return false; + } + } else { + if (encoders.isEmpty()) { + Log.e(TAG, "Valid encoder not found"); + return false; + } else { + codec = MediaCodec.createByCodecName(encoders.get(0).getName()); + } + } + + int channelCount = (isStereo) ? 2 : 1; + MediaFormat audioFormat = + MediaFormat.createAudioFormat(CodecUtil.AAC_MIME, sampleRate, channelCount); + audioFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate); + audioFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, maxInputSize); + audioFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, + MediaCodecInfo.CodecProfileLevel.AACObjectLC); + codec.configure(audioFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); + running = false; + Log.i(TAG, "prepared"); + return true; + } catch (IOException | IllegalStateException e) { + Log.e(TAG, "Create AudioEncoder failed.", e); + return false; + } + } + + /** + * Prepare encoder with default parameters + */ + public boolean prepareAudioEncoder() { + return prepareAudioEncoder(bitRate, sampleRate, isStereo, 0); + } + + @Override + public void start(boolean resetTs) { + presentTimeUs = System.nanoTime() / 1000; + codec.start(); + running = true; + Log.i(TAG, "started"); + } + + @Override + protected void stopImp() { + Log.i(TAG, "stopped"); + } + + @Override + protected Frame getInputFrame() throws InterruptedException { + return null; + } + + @Override + protected void checkBuffer(@NonNull ByteBuffer byteBuffer, + @NonNull MediaCodec.BufferInfo bufferInfo) { + + } + + @Override + protected void sendBuffer(@NonNull ByteBuffer byteBuffer, + @NonNull MediaCodec.BufferInfo bufferInfo) { + getAacData.getAacData(byteBuffer, bufferInfo); + } + + /** + * Set custom PCM data. + * Use it after prepareAudioEncoder(int sampleRate, int channel). + * Used too with microphone. + * + */ + @Override + public void inputPCMData(Frame frame) { + if (running) { + try { + getDataFromEncoder(frame); + } catch (IllegalStateException e) { + Log.i(TAG, "Encoding error", e); + } + } else { + Log.i(TAG, "frame discarded"); + } + } + + @Override + protected MediaCodecInfo chooseEncoder(String mime) { + List mediaCodecInfoList = CodecUtil.getAllEncoders(mime); + for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) { + String name = mediaCodecInfo.getName().toLowerCase(); + if (!name.contains("omx.google")) return mediaCodecInfo; + } + if (mediaCodecInfoList.size() > 0) { + return mediaCodecInfoList.get(0); + } else { + return null; + } + } + + public void setSampleRate(int sampleRate) { + this.sampleRate = sampleRate; + } + + @Override + public void formatChanged(@NonNull MediaCodec mediaCodec, @NonNull MediaFormat mediaFormat) { + getAacData.onAudioFormat(mediaFormat); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/audio/GetAacData.java b/encoder/src/main/java/com/pedro/encoder/audio/GetAacData.java new file mode 100644 index 0000000..15a7991 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/audio/GetAacData.java @@ -0,0 +1,17 @@ +package com.pedro.encoder.audio; + +import android.media.MediaCodec; + +import android.media.MediaFormat; +import java.nio.ByteBuffer; + +/** + * Created by pedro on 19/01/17. + */ + +public interface GetAacData { + + void getAacData(ByteBuffer aacBuffer, MediaCodec.BufferInfo info); + + void onAudioFormat(MediaFormat mediaFormat); +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/audio/AudioPostProcessEffect.java b/encoder/src/main/java/com/pedro/encoder/input/audio/AudioPostProcessEffect.java new file mode 100644 index 0000000..08ca5e6 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/audio/AudioPostProcessEffect.java @@ -0,0 +1,78 @@ +package com.pedro.encoder.input.audio; + +import android.media.audiofx.AcousticEchoCanceler; +import android.media.audiofx.AutomaticGainControl; +import android.media.audiofx.NoiseSuppressor; +import android.util.Log; + +/** + * Created by pedro on 11/05/17. + */ + +public class AudioPostProcessEffect { + + private final String TAG = "AudioPostProcessEffect"; + + private int microphoneId; + private AcousticEchoCanceler acousticEchoCanceler = null; + private AutomaticGainControl automaticGainControl = null; + private NoiseSuppressor noiseSuppressor = null; + + public AudioPostProcessEffect(int microphoneId) { + this.microphoneId = microphoneId; + } + + public void enableAutoGainControl() { + if (AutomaticGainControl.isAvailable() && automaticGainControl == null) { + automaticGainControl = AutomaticGainControl.create(microphoneId); + automaticGainControl.setEnabled(true); + Log.i(TAG, "AutoGainControl enabled"); + } else { + Log.e(TAG, "This device don't support AutoGainControl"); + } + } + + public void releaseAutoGainControl() { + if (automaticGainControl != null) { + automaticGainControl.setEnabled(false); + automaticGainControl.release(); + automaticGainControl = null; + } + } + + public void enableEchoCanceler() { + if (AcousticEchoCanceler.isAvailable() && acousticEchoCanceler == null) { + acousticEchoCanceler = AcousticEchoCanceler.create(microphoneId); + acousticEchoCanceler.setEnabled(true); + Log.i(TAG, "EchoCanceler enabled"); + } else { + Log.e(TAG, "This device don't support EchoCanceler"); + } + } + + public void releaseEchoCanceler() { + if (acousticEchoCanceler != null) { + acousticEchoCanceler.setEnabled(false); + acousticEchoCanceler.release(); + acousticEchoCanceler = null; + } + } + + public void enableNoiseSuppressor() { + if (NoiseSuppressor.isAvailable() && noiseSuppressor == null) { + noiseSuppressor = NoiseSuppressor.create(microphoneId); + noiseSuppressor.setEnabled(true); + Log.i(TAG, "NoiseSuppressor enabled"); + } else { + Log.e(TAG, "This device don't support NoiseSuppressor"); + } + } + + public void releaseNoiseSuppressor() { + if (noiseSuppressor != null) { + noiseSuppressor.setEnabled(false); + noiseSuppressor.release(); + noiseSuppressor = null; + } + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/audio/CustomAudioEffect.java b/encoder/src/main/java/com/pedro/encoder/input/audio/CustomAudioEffect.java new file mode 100644 index 0000000..9ec8ce2 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/audio/CustomAudioEffect.java @@ -0,0 +1,10 @@ +package com.pedro.encoder.input.audio; + +public abstract class CustomAudioEffect { + + /** + * @param pcmBuffer buffer obtained directly from the microphone. + * @return it must be of same size that pcmBuffer parameter. + */ + public abstract byte[] process(byte[] pcmBuffer); +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/audio/GetMicrophoneData.java b/encoder/src/main/java/com/pedro/encoder/input/audio/GetMicrophoneData.java new file mode 100644 index 0000000..5c62af5 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/audio/GetMicrophoneData.java @@ -0,0 +1,12 @@ +package com.pedro.encoder.input.audio; + +import com.pedro.encoder.Frame; + +/** + * Created by pedro on 19/01/17. + */ + +public interface GetMicrophoneData { + + void inputPCMData(Frame frame); +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/audio/MicrophoneManager.java b/encoder/src/main/java/com/pedro/encoder/input/audio/MicrophoneManager.java new file mode 100644 index 0000000..aa2376d --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/audio/MicrophoneManager.java @@ -0,0 +1,235 @@ +package com.pedro.encoder.input.audio; + +import android.media.AudioFormat; +import android.media.AudioPlaybackCaptureConfiguration; +import android.media.AudioRecord; +import android.media.MediaRecorder; +import android.media.projection.MediaProjection; +import android.os.Build; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import com.pedro.encoder.Frame; +import java.nio.ByteBuffer; + +/** + * Created by pedro on 19/01/17. + */ + +public class MicrophoneManager { + + private final String TAG = "MicrophoneManager"; + private static final int BUFFER_SIZE = 4096; + protected AudioRecord audioRecord; + private GetMicrophoneData getMicrophoneData; + private ByteBuffer pcmBuffer = ByteBuffer.allocateDirect(BUFFER_SIZE); + private byte[] pcmBufferMuted = new byte[BUFFER_SIZE]; + protected boolean running = false; + private boolean created = false; + + //default parameters for microphone + private int sampleRate = 32000; //hz + private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; + private int channel = AudioFormat.CHANNEL_IN_STEREO; + private boolean muted = false; + private AudioPostProcessEffect audioPostProcessEffect; + HandlerThread handlerThread; + private CustomAudioEffect customAudioEffect = new NoAudioEffect(); + + public MicrophoneManager(GetMicrophoneData getMicrophoneData) { + this.getMicrophoneData = getMicrophoneData; + } + + public void setCustomAudioEffect(CustomAudioEffect customAudioEffect) { + this.customAudioEffect = customAudioEffect; + } + + /** + * Create audio record + */ + public void createMicrophone() { + createMicrophone(sampleRate, true, false, false); + Log.i(TAG, "Microphone created, " + sampleRate + "hz, Stereo"); + } + + /** + * Create audio record with params and default audio source + */ + public void createMicrophone(int sampleRate, boolean isStereo, boolean echoCanceler, + boolean noiseSuppressor) { + createMicrophone(MediaRecorder.AudioSource.DEFAULT, sampleRate, isStereo, echoCanceler, noiseSuppressor); + } + + /** + * Create audio record with params and selected audio source + * @param audioSource - the recording source. See {@link MediaRecorder.AudioSource} for the recording source definitions. + */ + public void createMicrophone(int audioSource, int sampleRate, boolean isStereo, boolean echoCanceler, + boolean noiseSuppressor) { + this.sampleRate = sampleRate; + if (!isStereo) channel = AudioFormat.CHANNEL_IN_MONO; + audioRecord = + new AudioRecord(audioSource, sampleRate, channel, audioFormat, + getPcmBufferSize()); + audioPostProcessEffect = new AudioPostProcessEffect(audioRecord.getAudioSessionId()); + if (echoCanceler) audioPostProcessEffect.enableEchoCanceler(); + if (noiseSuppressor) audioPostProcessEffect.enableNoiseSuppressor(); + String chl = (isStereo) ? "Stereo" : "Mono"; + Log.i(TAG, "Microphone created, " + sampleRate + "hz, " + chl); + created = true; + } + + /** + * Create audio record with params and AudioPlaybackCaptureConfig used for capturing internal audio + * Notice that you should granted {@link android.Manifest.permission#RECORD_AUDIO} before calling this! + * + * @param config - AudioPlaybackCaptureConfiguration received from {@link android.media.projection.MediaProjection} + * + * @see AudioPlaybackCaptureConfiguration.Builder#Builder(MediaProjection) + * @see "https://developer.android.com/guide/topics/media/playback-capture" + * @see "https://medium.com/@debuggingisfun/android-10-audio-capture-77dd8e9070f9" + */ + public void createInternalMicrophone(AudioPlaybackCaptureConfiguration config, int sampleRate, boolean isStereo) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + this.sampleRate = sampleRate; + if (!isStereo) channel = AudioFormat.CHANNEL_IN_MONO; + audioRecord = new AudioRecord.Builder() + .setAudioPlaybackCaptureConfig(config) + .setAudioFormat(new AudioFormat.Builder() + .setEncoding(audioFormat) + .setSampleRate(sampleRate) + .setChannelMask(channel) + .build()) + .setBufferSizeInBytes(getPcmBufferSize()) + .build(); + + audioPostProcessEffect = new AudioPostProcessEffect(audioRecord.getAudioSessionId()); + String chl = (isStereo) ? "Stereo" : "Mono"; + Log.i(TAG, "Internal microphone created, " + sampleRate + "hz, " + chl); + created = true; + } else createMicrophone(sampleRate, isStereo, false, false); + } + + + /** + * Start record and get data + */ + public synchronized void start() { + init(); + handlerThread = new HandlerThread(TAG); + handlerThread.start(); + Handler handler = new Handler(handlerThread.getLooper()); + handler.post(new Runnable() { + @Override + public void run() { + while (running) { + Frame frame = read(); + if (frame != null) { + getMicrophoneData.inputPCMData(frame); + } else { + running = false; + } + } + } + }); + } + + private void init() { + if (audioRecord != null) { + audioRecord.startRecording(); + running = true; + Log.i(TAG, "Microphone started"); + } else { + Log.e(TAG, "Error starting, microphone was stopped or not created, " + + "use createMicrophone() before start()"); + } + } + + public void mute() { + muted = true; + } + + public void unMute() { + muted = false; + } + + public boolean isMuted() { + return muted; + } + + /** + * @return Object with size and PCM buffer data + */ + private Frame read() { + pcmBuffer.rewind(); + int size = audioRecord.read(pcmBuffer, pcmBuffer.remaining()); + if (size <= 0) { + return null; + } + return new Frame(muted ? pcmBufferMuted : customAudioEffect.process(pcmBuffer.array()), + muted ? 0 : pcmBuffer.arrayOffset(), size); + } + + /** + * Stop and release microphone + */ + public synchronized void stop() { + running = false; + created = false; + if (handlerThread != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + handlerThread.quitSafely(); + } else { + handlerThread.quit(); + } + } + if (audioRecord != null) { + audioRecord.setRecordPositionUpdateListener(null); + audioRecord.stop(); + audioRecord.release(); + audioRecord = null; + } + if (audioPostProcessEffect != null) { + audioPostProcessEffect.releaseEchoCanceler(); + audioPostProcessEffect.releaseNoiseSuppressor(); + } + Log.i(TAG, "Microphone stopped"); + } + + /** + * Get PCM buffer size + */ + private int getPcmBufferSize() { + int pcmBufSize = + AudioRecord.getMinBufferSize(sampleRate, channel, AudioFormat.ENCODING_PCM_16BIT); + return pcmBufSize * 5; + } + + public int getMaxInputSize() { + return BUFFER_SIZE; + } + + public int getSampleRate() { + return sampleRate; + } + + public void setSampleRate(int sampleRate) { + this.sampleRate = sampleRate; + } + + public int getAudioFormat() { + return audioFormat; + } + + public int getChannel() { + return channel; + } + + public boolean isRunning() { + return running; + } + + public boolean isCreated() { + return created; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/audio/MicrophoneManagerManual.java b/encoder/src/main/java/com/pedro/encoder/input/audio/MicrophoneManagerManual.java new file mode 100644 index 0000000..a97a40b --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/audio/MicrophoneManagerManual.java @@ -0,0 +1,57 @@ +package com.pedro.encoder.input.audio; + +import android.os.HandlerThread; +import android.util.Log; + +import java.nio.ByteBuffer; + +/** + * Similar to MicrophoneManager but samples are not read automatically. + * The owner must manually call read(...) as often as samples are needed. + */ +public class MicrophoneManagerManual extends MicrophoneManager { + + private final String TAG = "MicMM"; + + public MicrophoneManagerManual() { + super(null); + } + + /** + * Start record and get data + */ + @Override + public synchronized void start() { + init(); + } + + private void init() { + if (audioRecord != null) { + audioRecord.startRecording(); + running = true; + Log.i(TAG, "Microphone started"); + } else { + Log.e(TAG, "Error starting, microphone was stopped or not created, " + + "use createMicrophone() before start()"); + } + } + + /** + * Call when you need mic samples. + * This method will block until numBytes worth of samples are ready. + */ + public int read(ByteBuffer directBuffer, int numBytes) { + directBuffer.rewind(); + // write to the buffer and return number of bytes written. + return audioRecord.read(directBuffer, numBytes); + } + + /** + * Stop and release microphone + */ + public synchronized void stop() { + // handlerThread must not be null, else the stop impl will throw + handlerThread = new HandlerThread("nothing"); + super.stop(); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/audio/NoAudioEffect.java b/encoder/src/main/java/com/pedro/encoder/input/audio/NoAudioEffect.java new file mode 100644 index 0000000..90078e6 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/audio/NoAudioEffect.java @@ -0,0 +1,9 @@ +package com.pedro.encoder.input.audio; + +public class NoAudioEffect extends CustomAudioEffect { + + @Override + public byte[] process(byte[] pcmBuffer) { + return pcmBuffer; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/decoder/AudioDecoder.java b/encoder/src/main/java/com/pedro/encoder/input/decoder/AudioDecoder.java new file mode 100644 index 0000000..d2a03b3 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/decoder/AudioDecoder.java @@ -0,0 +1,243 @@ +package com.pedro.encoder.input.decoder; + +import android.media.MediaCodec; +import android.media.MediaExtractor; +import android.media.MediaFormat; +import android.util.Log; +import com.pedro.encoder.Frame; +import com.pedro.encoder.input.audio.GetMicrophoneData; +import com.pedro.encoder.utils.PCMUtil; +import java.io.IOException; +import java.nio.ByteBuffer; + +/** + * Created by pedro on 20/06/17. + */ +public class AudioDecoder { + + private final String TAG = "AudioDecoder"; + + private AudioDecoderInterface audioDecoderInterface; + private LoopFileInterface loopFileInterface; + private MediaExtractor audioExtractor; + private MediaCodec audioDecoder; + private MediaCodec.BufferInfo audioInfo = new MediaCodec.BufferInfo(); + private boolean decoding; + private Thread thread; + private GetMicrophoneData getMicrophoneData; + private MediaFormat audioFormat; + private String mime = ""; + private int sampleRate; + private boolean isStereo; + private int channels = 1; + private int size = 2048; + private byte[] pcmBuffer = new byte[size]; + private byte[] pcmBufferMuted = new byte[11]; + private static boolean loopMode = false; + private boolean muted = false; + private long duration; + private volatile long seekTime = 0; + private volatile long startMs = 0; + + public AudioDecoder(GetMicrophoneData getMicrophoneData, + AudioDecoderInterface audioDecoderInterface, LoopFileInterface loopFileInterface) { + this.getMicrophoneData = getMicrophoneData; + this.audioDecoderInterface = audioDecoderInterface; + this.loopFileInterface = loopFileInterface; + } + + public boolean initExtractor(String filePath) throws IOException { + decoding = false; + audioExtractor = new MediaExtractor(); + audioExtractor.setDataSource(filePath); + for (int i = 0; i < audioExtractor.getTrackCount() && !mime.startsWith("audio/"); i++) { + audioFormat = audioExtractor.getTrackFormat(i); + mime = audioFormat.getString(MediaFormat.KEY_MIME); + if (mime.startsWith("audio/")) { + audioExtractor.selectTrack(i); + } else { + audioFormat = null; + } + } + if (audioFormat != null) { + channels = audioFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT); + isStereo = channels >= 2; + sampleRate = audioFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE); + duration = audioFormat.getLong(MediaFormat.KEY_DURATION); + if (channels >= 2) { + pcmBuffer = new byte[2048 * channels]; + } + return true; + //audio decoder not supported + } else { + mime = ""; + audioFormat = null; + return false; + } + } + + public boolean prepareAudio() { + try { + audioDecoder = MediaCodec.createDecoderByType(mime); + audioDecoder.configure(audioFormat, null, null, 0); + return true; + } catch (IOException e) { + Log.e(TAG, "Prepare decoder error:", e); + return false; + } + } + + public void start() { + decoding = true; + audioDecoder.start(); + thread = new Thread(new Runnable() { + @Override + public void run() { + try { + decodeAudio(); + } catch (IllegalStateException e) { + Log.i(TAG, "Decoding error", e); + } + } + }); + thread.start(); + } + + public void stop() { + decoding = false; + seekTime = 0; + if (thread != null) { + thread.interrupt(); + try { + thread.join(100); + } catch (InterruptedException e) { + thread.interrupt(); + } + thread = null; + } + try { + audioDecoder.stop(); + audioDecoder.release(); + audioDecoder = null; + } catch (IllegalStateException | NullPointerException e) { + audioDecoder = null; + } + if (audioExtractor != null) { + audioExtractor.release(); + audioExtractor = null; + } + } + + private void decodeAudio() throws IllegalStateException { + ByteBuffer[] inputBuffers = audioDecoder.getInputBuffers(); + ByteBuffer[] outputBuffers = audioDecoder.getOutputBuffers(); + startMs = System.currentTimeMillis(); + while (decoding) { + int inIndex = audioDecoder.dequeueInputBuffer(10000); + if (inIndex >= 0) { + ByteBuffer buffer = inputBuffers[inIndex]; + int sampleSize = audioExtractor.readSampleData(buffer, 0); + if (sampleSize < 0) { + audioDecoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); + } else { + audioDecoder.queueInputBuffer(inIndex, 0, sampleSize, audioExtractor.getSampleTime(), 0); + audioExtractor.advance(); + } + + int outIndex = audioDecoder.dequeueOutputBuffer(audioInfo, 10000); + switch (outIndex) { + case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED: + outputBuffers = audioDecoder.getOutputBuffers(); + break; + case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: + case MediaCodec.INFO_TRY_AGAIN_LATER: + break; + default: + //needed for fix decode speed + while (audioExtractor.getSampleTime() / 1000 + > System.currentTimeMillis() - startMs + seekTime) { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + if (thread != null) thread.interrupt(); + return; + } + } + ByteBuffer outBuffer = outputBuffers[outIndex]; + //This buffer is PCM data + if (muted) { + outBuffer.get(pcmBufferMuted, 0, + outBuffer.remaining() <= pcmBufferMuted.length ? outBuffer.remaining() + : pcmBufferMuted.length); + getMicrophoneData.inputPCMData(new Frame(pcmBufferMuted, 0, pcmBufferMuted.length)); + } else { + outBuffer.get(pcmBuffer, 0, + outBuffer.remaining() <= pcmBuffer.length ? outBuffer.remaining() + : pcmBuffer.length); + if (channels > 2) { //downgrade to stereo + byte[] bufferStereo = PCMUtil.pcmToStereo(pcmBuffer, channels); + getMicrophoneData.inputPCMData(new Frame(bufferStereo, 0, bufferStereo.length)); + } else { + getMicrophoneData.inputPCMData(new Frame(pcmBuffer, 0, pcmBuffer.length)); + } + } + audioDecoder.releaseOutputBuffer(outIndex, false); + break; + } + + // All decoded frames have been rendered, we can stop playing now + if ((audioInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { + seekTime = 0; + Log.i(TAG, "end of file out"); + if (loopMode) { + loopFileInterface.onReset(false); + } else { + audioDecoderInterface.onAudioDecoderFinished(); + } + } + } + } + } + + public double getTime() { + if (decoding) { + return audioExtractor.getSampleTime() / 10E5; + } else { + return 0; + } + } + + public void moveTo(double time) { + audioExtractor.seekTo((long) (time * 10E5), MediaExtractor.SEEK_TO_CLOSEST_SYNC); + seekTime = audioExtractor.getSampleTime() / 1000; + startMs = System.currentTimeMillis(); + } + + public void setLoopMode(boolean loopMode) { + this.loopMode = loopMode; + } + + public void mute() { + muted = true; + } + + public void unMute() { + muted = false; + } + + public boolean isMuted() { + return muted; + } + + public int getSampleRate() { + return sampleRate; + } + + public boolean isStereo() { + return isStereo; + } + + public double getDuration() { + return duration / 10E5; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/decoder/AudioDecoderInterface.java b/encoder/src/main/java/com/pedro/encoder/input/decoder/AudioDecoderInterface.java new file mode 100644 index 0000000..96eb58b --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/decoder/AudioDecoderInterface.java @@ -0,0 +1,10 @@ +package com.pedro.encoder.input.decoder; + +/** + * Created by pedro on 6/07/17. + */ + +public interface AudioDecoderInterface { + + void onAudioDecoderFinished(); +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/decoder/LoopFileInterface.java b/encoder/src/main/java/com/pedro/encoder/input/decoder/LoopFileInterface.java new file mode 100644 index 0000000..acf1b92 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/decoder/LoopFileInterface.java @@ -0,0 +1,10 @@ +package com.pedro.encoder.input.decoder; + +/** + * Created by pedro on 4/03/18. + */ + +public interface LoopFileInterface { + + void onReset(boolean isVideo); +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/decoder/VideoDecoder.java b/encoder/src/main/java/com/pedro/encoder/input/decoder/VideoDecoder.java new file mode 100644 index 0000000..4d50169 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/decoder/VideoDecoder.java @@ -0,0 +1,187 @@ +package com.pedro.encoder.input.decoder; + +import android.media.MediaCodec; +import android.media.MediaExtractor; +import android.media.MediaFormat; +import android.util.Log; +import android.view.Surface; +import java.io.IOException; +import java.nio.ByteBuffer; + +/** + * Created by pedro on 20/06/17. + */ +public class VideoDecoder { + + private final String TAG = "VideoDecoder"; + + private VideoDecoderInterface videoDecoderInterface; + private LoopFileInterface loopFileInterface; + private MediaExtractor videoExtractor; + private MediaCodec videoDecoder; + private MediaCodec.BufferInfo videoInfo = new MediaCodec.BufferInfo(); + private boolean decoding; + private Thread thread; + private MediaFormat videoFormat; + private String mime = ""; + private int width; + private int height; + private long duration; + private static boolean loopMode = false; + private volatile long seekTime = 0; + private volatile long startMs = 0; + + public VideoDecoder(VideoDecoderInterface videoDecoderInterface, + LoopFileInterface loopFileInterface) { + this.videoDecoderInterface = videoDecoderInterface; + this.loopFileInterface = loopFileInterface; + } + + public boolean initExtractor(String filePath) throws IOException { + decoding = false; + videoExtractor = new MediaExtractor(); + videoExtractor.setDataSource(filePath); + for (int i = 0; i < videoExtractor.getTrackCount() && !mime.startsWith("video/"); i++) { + videoFormat = videoExtractor.getTrackFormat(i); + mime = videoFormat.getString(MediaFormat.KEY_MIME); + if (mime.startsWith("video/")) { + videoExtractor.selectTrack(i); + } else { + videoFormat = null; + } + } + if (videoFormat != null) { + width = videoFormat.getInteger(MediaFormat.KEY_WIDTH); + height = videoFormat.getInteger(MediaFormat.KEY_HEIGHT); + duration = videoFormat.getLong(MediaFormat.KEY_DURATION); + return true; + //video decoder not supported + } else { + mime = ""; + videoFormat = null; + return false; + } + } + + public boolean prepareVideo(Surface surface) { + try { + videoDecoder = MediaCodec.createDecoderByType(mime); + videoDecoder.configure(videoFormat, surface, null, 0); + return true; + } catch (IOException e) { + Log.e(TAG, "Prepare decoder error:", e); + return false; + } + } + + public void start() { + decoding = true; + videoDecoder.start(); + thread = new Thread(new Runnable() { + @Override + public void run() { + try { + decodeVideo(); + } catch (IllegalStateException e) { + Log.i(TAG, "Decoding error", e); + } + } + }); + thread.start(); + } + + public void stop() { + decoding = false; + seekTime = 0; + if (thread != null) { + thread.interrupt(); + try { + thread.join(100); + } catch (InterruptedException e) { + thread.interrupt(); + } + thread = null; + } + try { + videoDecoder.stop(); + videoDecoder.release(); + videoDecoder = null; + } catch (IllegalStateException | NullPointerException e) { + videoDecoder = null; + } + if (videoExtractor != null) { + videoExtractor.release(); + videoExtractor = null; + } + } + + private void decodeVideo() throws IllegalStateException { + ByteBuffer[] inputBuffers = videoDecoder.getInputBuffers(); + startMs = System.currentTimeMillis(); + while (decoding) { + int inIndex = videoDecoder.dequeueInputBuffer(10000); + if (inIndex >= 0) { + ByteBuffer buffer = inputBuffers[inIndex]; + int sampleSize = videoExtractor.readSampleData(buffer, 0); + if (sampleSize < 0) { + videoDecoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); + } else { + videoDecoder.queueInputBuffer(inIndex, 0, sampleSize, videoExtractor.getSampleTime(), 0); + videoExtractor.advance(); + } + } + int outIndex = videoDecoder.dequeueOutputBuffer(videoInfo, 10000); + if (outIndex >= 0) { + while (videoExtractor.getSampleTime() / 1000 + > System.currentTimeMillis() - startMs + seekTime) { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + if (thread != null) thread.interrupt(); + return; + } + } + videoDecoder.releaseOutputBuffer(outIndex, videoInfo.size != 0); + } + if ((videoInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { + seekTime = 0; + Log.i(TAG, "end of file out"); + if (loopMode) { + loopFileInterface.onReset(true); + } else { + videoDecoderInterface.onVideoDecoderFinished(); + } + } + } + } + + public double getTime() { + if (decoding) { + return videoExtractor.getSampleTime() / 10E5; + } else { + return 0; + } + } + + public void moveTo(double time) { + videoExtractor.seekTo((long) (time * 10E5), MediaExtractor.SEEK_TO_CLOSEST_SYNC); + seekTime = videoExtractor.getSampleTime() / 1000; + startMs = System.currentTimeMillis(); + } + + public void setLoopMode(boolean loopMode) { + this.loopMode = loopMode; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public double getDuration() { + return duration / 10E5; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/decoder/VideoDecoderInterface.java b/encoder/src/main/java/com/pedro/encoder/input/decoder/VideoDecoderInterface.java new file mode 100644 index 0000000..e3c2eb4 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/decoder/VideoDecoderInterface.java @@ -0,0 +1,10 @@ +package com.pedro.encoder.input.decoder; + +/** + * Created by pedro on 6/07/17. + */ + +public interface VideoDecoderInterface { + + void onVideoDecoderFinished(); +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/Sprite.java b/encoder/src/main/java/com/pedro/encoder/input/gl/Sprite.java new file mode 100644 index 0000000..b4125c3 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/Sprite.java @@ -0,0 +1,175 @@ +package com.pedro.encoder.input.gl; + +import android.graphics.PointF; + +import com.pedro.encoder.utils.gl.TranslateTo; + +/** + * Created by pedro on 17/11/17. + * + * Sprite is drawn from top left of the image. + * Sprite positions in screen: + * + * 0,0 100,0 + * ________ + * | | + * | | + * | Screen | + * | | + * |________| + * + * 0,100 100,100 + */ + +public class Sprite { + + private final float[] squareVertexDataSprite = { + //X Y + 0f, 1f, //top left + 1f, 1f, //top right + 0f, 0f, //bottom left + 1f, 0f, //bottom right + }; + + private PointF scale; + private PointF position; + + public Sprite() { + reset(); + } + + /** + * @param deltaX Position x in percent + * @param deltaY Position x in percent + */ + public void translate(float deltaX, float deltaY) { + position.x = deltaX; + position.y = deltaY; + } + + /** + * @param translation Predefined position + */ + public void translate(TranslateTo translation) { + switch (translation) { + case CENTER: + this.position.x = 50f - scale.x / 2f; + this.position.y = 50f - scale.x / 2f; + break; + case BOTTOM: + this.position.x = 50f - scale.x / 2f; + this.position.y = 100f - scale.y; + break; + case TOP: + this.position.x = 50f - scale.x / 2f; + this.position.y = 0f; + break; + case LEFT: + this.position.x = 0f; + this.position.y = 50f - scale.y / 2f; + break; + case RIGHT: + this.position.x = 100f - scale.x; + this.position.y = 50f - scale.y / 2f; + break; + case TOP_LEFT: + this.position.x = 0f; + this.position.y = 0f; + break; + case TOP_RIGHT: + this.position.x = 100f - scale.x; + this.position.y = 0f; + break; + case BOTTOM_LEFT: + this.position.x = 0f; + this.position.y = 100f - scale.y; + break; + case BOTTOM_RIGHT: + this.position.x = 100f - scale.x; + this.position.y = 100f - scale.y; + break; + default: + break; + } + } + + /** + * @param deltaX Scale x in percent + * @param deltaY Scale y in percent + */ + public void scale(float deltaX, float deltaY) { + //keep old position + position.x /= deltaX / scale.x; + position.y /= deltaY / scale.y; + //set new scale. + scale = new PointF(deltaX, deltaY); + } + + /** + * @return Scale in percent + */ + public PointF getScale() { + return scale; + } + + /** + * @return Position in percent + */ + public PointF getTranslation() { + return position; + } + + public void reset() { + scale = new PointF(100f, 100f); + position = new PointF(0f, 0f); + } + + /** + * @return Actual vertex of sprite. + */ + public float[] getTransformedVertices() { + PointF bottomRight = new PointF(squareVertexDataSprite[0], squareVertexDataSprite[1]); + PointF bottomLeft = new PointF(squareVertexDataSprite[2], squareVertexDataSprite[3]); + PointF topRight = new PointF(squareVertexDataSprite[4], squareVertexDataSprite[5]); + PointF topLeft = new PointF(squareVertexDataSprite[6], squareVertexDataSprite[7]); + //Traduce scale to Opengl vertex values + float scaleX = scale.x / 100f; + float scaleY = scale.y / 100f; + + //Scale sprite + bottomRight.x /= scaleX; + bottomRight.y /= scaleY; + + bottomLeft.x /= scaleX; + bottomLeft.y /= scaleY; + + topRight.x /= scaleX; + topRight.y /= scaleY; + + topLeft.x /= scaleX; + topLeft.y /= scaleY; + + //Traduce position to Opengl values + float positionX = -position.x / scale.x; + float positionY = -position.y / scale.y; + + //Translate sprite + bottomRight.x += positionX; + bottomRight.y += positionY; + + bottomLeft.x += positionX; + bottomLeft.y += positionY; + + topRight.x += positionX; + topRight.y += positionY; + + topLeft.x += positionX; + topLeft.y += positionY; + + //Recreate vertex like initial vertex. + return new float[] { + bottomRight.x, bottomRight.y, bottomLeft.x, bottomLeft.y, topRight.x, topRight.y, topLeft.x, + topLeft.y, + }; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/SpriteGestureController.java b/encoder/src/main/java/com/pedro/encoder/input/gl/SpriteGestureController.java new file mode 100644 index 0000000..c26ee45 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/SpriteGestureController.java @@ -0,0 +1,92 @@ +package com.pedro.encoder.input.gl; + +import android.graphics.PointF; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.view.MotionEvent; +import android.view.View; +import com.pedro.encoder.input.gl.render.filters.object.BaseObjectFilterRender; +import com.pedro.encoder.input.video.CameraHelper; + +/** + * Created by pedro on 9/09/17. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class SpriteGestureController { + + private BaseObjectFilterRender baseObjectFilterRender; + private float lastDistance; + private boolean preventMoveOutside = true; + + public SpriteGestureController() { + } + + public SpriteGestureController(BaseObjectFilterRender sprite) { + this.baseObjectFilterRender = sprite; + } + + public BaseObjectFilterRender getBaseObjectFilterRender() { + return baseObjectFilterRender; + } + + public void setBaseObjectFilterRender(BaseObjectFilterRender baseObjectFilterRender) { + this.baseObjectFilterRender = baseObjectFilterRender; + } + + public void setPreventMoveOutside(boolean preventMoveOutside) { + this.preventMoveOutside = preventMoveOutside; + } + + public boolean spriteTouched(View view, MotionEvent motionEvent) { + if (baseObjectFilterRender == null) return false; + float xPercent = motionEvent.getX() * 100 / view.getWidth(); + float yPercent = motionEvent.getY() * 100 / view.getHeight(); + PointF scale = baseObjectFilterRender.getScale(); + PointF position = baseObjectFilterRender.getPosition(); + boolean xTouched = xPercent >= position.x && xPercent <= position.x + scale.x; + boolean yTouched = yPercent >= position.y && yPercent <= position.y + scale.y; + return xTouched && yTouched; + } + + public void moveSprite(View view, MotionEvent motionEvent) { + if (baseObjectFilterRender == null) return; + if (motionEvent.getPointerCount() == 1) { + float xPercent = motionEvent.getX() * 100 / view.getWidth(); + float yPercent = motionEvent.getY() * 100 / view.getHeight(); + PointF scale = baseObjectFilterRender.getScale(); + if (preventMoveOutside) { + float x = xPercent - scale.x / 2.0F; + float y = yPercent - scale.y / 2.0F; + if (x < 0) { + x = 0; + } + if (x + scale.x > 100.0F) { + x = 100.0F - scale.x; + } + if (y < 0) { + y = 0; + } + if (y + scale.y > 100.0F) { + y = 100.0F - scale.y; + } + baseObjectFilterRender.setPosition(x, y); + } else { + baseObjectFilterRender.setPosition(xPercent - scale.x / 2f, yPercent - scale.y / 2f); + } + } + } + + public void scaleSprite(MotionEvent motionEvent) { + if (baseObjectFilterRender == null) return; + if (motionEvent.getPointerCount() > 1) { + float distance = CameraHelper.getFingerSpacing(motionEvent); + float percent = distance >= lastDistance ? 1 : -1; + PointF scale = baseObjectFilterRender.getScale(); + scale.x += percent; + scale.y += percent; + baseObjectFilterRender.setScale(scale.x, scale.y); + lastDistance = distance; + } + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/SurfaceManager.java b/encoder/src/main/java/com/pedro/encoder/input/gl/SurfaceManager.java new file mode 100644 index 0000000..a85e754 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/SurfaceManager.java @@ -0,0 +1,162 @@ +package com.pedro.encoder.input.gl; + +import android.opengl.EGL14; +import android.opengl.EGLConfig; +import android.opengl.EGLContext; +import android.opengl.EGLDisplay; +import android.opengl.EGLExt; +import android.opengl.EGLSurface; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.util.Log; +import android.view.Surface; +import com.pedro.encoder.utils.gl.GlUtil; + +/** + * Created by pedro on 9/09/17. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class SurfaceManager { + + private static final int EGL_RECORDABLE_ANDROID = 0x3142; + + private EGLContext eglContext = null; + private EGLSurface eglSurface = null; + private EGLDisplay eglDisplay = null; + + /** + * Creates an EGL context and an EGL surface. + */ + public SurfaceManager(Surface surface, SurfaceManager manager) { + eglSetup(surface, manager.eglContext); + } + + /** + * Creates an EGL context and an EGL surface. + */ + public SurfaceManager(Surface surface, EGLContext eglContext) { + eglSetup(surface, eglContext); + } + + /** + * Creates an EGL context and an EGL surface. + */ + public SurfaceManager(Surface surface) { + eglSetup(surface, null); + } + + public SurfaceManager() { + eglSetup(null, null); + } + + public void makeCurrent() { + if (!EGL14.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) { + Log.e("Error", "eglMakeCurrent failed"); + } + } + + public void swapBuffer() { + EGL14.eglSwapBuffers(eglDisplay, eglSurface); + } + + /** + * Sends the presentation time stamp to EGL. Time is expressed in nanoseconds. + */ + public void setPresentationTime(long nsecs) { + EGLExt.eglPresentationTimeANDROID(eglDisplay, eglSurface, nsecs); + GlUtil.checkEglError("eglPresentationTimeANDROID"); + } + + /** + * Prepares EGL. We want a GLES 2.0 context and a surface that supports recording. + */ + private void eglSetup(Surface surface, EGLContext eglSharedContext) { + eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); + if (eglDisplay == EGL14.EGL_NO_DISPLAY) { + throw new RuntimeException("unable to get EGL14 display"); + } + int[] version = new int[2]; + if (!EGL14.eglInitialize(eglDisplay, version, 0, version, 1)) { + throw new RuntimeException("unable to initialize EGL14"); + } + + // Configure EGL for recording and OpenGL ES 2.0. + int[] attribList; + if (eglSharedContext == null) { + attribList = new int[] { + EGL14.EGL_RED_SIZE, 8, EGL14.EGL_GREEN_SIZE, 8, EGL14.EGL_BLUE_SIZE, 8, + EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT, + /* AA https://stackoverflow.com/questions/27035893/antialiasing-in-opengl-es-2-0 */ + //EGL14.EGL_SAMPLE_BUFFERS, 1 /* true */, + //EGL14.EGL_SAMPLES, 4, /* increase to more smooth limit of your GPU */ + EGL14.EGL_NONE + }; + } else { + attribList = new int[] { + EGL14.EGL_RED_SIZE, 8, EGL14.EGL_GREEN_SIZE, 8, EGL14.EGL_BLUE_SIZE, 8, + EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT, EGL_RECORDABLE_ANDROID, 1, + /* AA https://stackoverflow.com/questions/27035893/antialiasing-in-opengl-es-2-0 */ + //EGL14.EGL_SAMPLE_BUFFERS, 1 /* true */, + //EGL14.EGL_SAMPLES, 4, /* increase to more smooth limit of your GPU */ + EGL14.EGL_NONE + }; + } + EGLConfig[] configs = new EGLConfig[1]; + int[] numConfigs = new int[1]; + EGL14.eglChooseConfig(eglDisplay, attribList, 0, configs, 0, configs.length, numConfigs, 0); + GlUtil.checkEglError("eglCreateContext RGB888+recordable ES2"); + + // Configure context for OpenGL ES 2.0. + int[] attrib_list = { + EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE + }; + + eglContext = EGL14.eglCreateContext(eglDisplay, configs[0], + eglSharedContext == null ? EGL14.EGL_NO_CONTEXT : eglSharedContext, attrib_list, 0); + GlUtil.checkEglError("eglCreateContext"); + + // Create a window surface, and attach it to the Surface we received. + if (surface == null) { + int[] surfaceAttribs = { + EGL14.EGL_WIDTH, 1, EGL14.EGL_HEIGHT, 1, EGL14.EGL_NONE + }; + eglSurface = EGL14.eglCreatePbufferSurface(eglDisplay, configs[0], surfaceAttribs, 0); + } else { + int[] surfaceAttribs = { + EGL14.EGL_NONE + }; + eglSurface = EGL14.eglCreateWindowSurface(eglDisplay, configs[0], surface, surfaceAttribs, 0); + } + GlUtil.checkEglError("eglCreateWindowSurface"); + } + + /** + * Discards all resources held by this class, notably the EGL context. + */ + public void release() { + if (eglDisplay != EGL14.EGL_NO_DISPLAY) { + EGL14.eglMakeCurrent(eglDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, + EGL14.EGL_NO_CONTEXT); + EGL14.eglDestroySurface(eglDisplay, eglSurface); + EGL14.eglDestroyContext(eglDisplay, eglContext); + EGL14.eglReleaseThread(); + EGL14.eglTerminate(eglDisplay); + } + eglDisplay = EGL14.EGL_NO_DISPLAY; + eglContext = EGL14.EGL_NO_CONTEXT; + eglSurface = EGL14.EGL_NO_SURFACE; + } + + public EGLContext getEglContext() { + return eglContext; + } + + public EGLSurface getEglSurface() { + return eglSurface; + } + + public EGLDisplay getEglDisplay() { + return eglDisplay; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/TextureLoader.java b/encoder/src/main/java/com/pedro/encoder/input/gl/TextureLoader.java new file mode 100644 index 0000000..f863eb7 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/TextureLoader.java @@ -0,0 +1,30 @@ +package com.pedro.encoder.input.gl; + +import android.graphics.Bitmap; +import android.opengl.GLES20; +import android.opengl.GLUtils; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.utils.gl.GlUtil; + +/** + * Created by pedro on 9/10/17. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class TextureLoader { + + public int[] load(Bitmap[] bitmaps) { + int[] textureId = new int[bitmaps.length]; + GlUtil.createTextures(bitmaps.length, textureId, 0); + for (int i = 0; i < bitmaps.length; i++) { + if (bitmaps[i] != null) { + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[i]); + GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmaps[i], 0); + bitmaps[i].recycle(); + bitmaps[i] = null; + } + } + return textureId; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/BaseRenderOffScreen.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/BaseRenderOffScreen.java new file mode 100644 index 0000000..b3b245c --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/BaseRenderOffScreen.java @@ -0,0 +1,80 @@ +package com.pedro.encoder.input.gl.render; + +import android.content.Context; +import android.opengl.GLES20; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.FloatBuffer; + +/** + * Created by pedro on 29/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public abstract class BaseRenderOffScreen { + + protected FloatBuffer squareVertex; + + public static final int FLOAT_SIZE_BYTES = 4; + public static final int SQUARE_VERTEX_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES; + public static final int SQUARE_VERTEX_DATA_POS_OFFSET = 0; + public static final int SQUARE_VERTEX_DATA_UV_OFFSET = 3; + + protected float[] MVPMatrix = new float[16]; + protected float[] STMatrix = new float[16]; + + protected RenderHandler renderHandler = new RenderHandler(); + + protected int width; + protected int height; + + public abstract void initGl(int width, int height, Context context, int previewWidth, + int previewHeight); + + public abstract void draw(); + + public abstract void release(); + + public int getTexId() { + return renderHandler.getTexId()[0]; + } + + protected void initFBO(int width, int height) { + initFBO(width, height, renderHandler.getFboId(), renderHandler.getRboId(), + renderHandler.getTexId()); + } + + protected void initFBO(int width, int height, int[] fboId, int[] rboId, int[] texId) { + GlUtil.checkGlError("initFBO_S"); + + GLES20.glGenFramebuffers(1, fboId, 0); + GLES20.glGenRenderbuffers(1, rboId, 0); + GLES20.glGenTextures(1, texId, 0); + + GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, rboId[0]); + GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, width, + height); + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId[0]); + GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, + GLES20.GL_RENDERBUFFER, rboId[0]); + + GLES20.glActiveTexture(GLES20.GL_TEXTURE3); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId[0]); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); + + GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, + GLES20.GL_UNSIGNED_BYTE, null); + GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, + GLES20.GL_TEXTURE_2D, texId[0], 0); + + int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER); + if (status != GLES20.GL_FRAMEBUFFER_COMPLETE) { + throw new RuntimeException("FrameBuffer uncompleted code: " + status); + } + GlUtil.checkGlError("initFBO_E"); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/CameraRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/CameraRender.java new file mode 100644 index 0000000..755cab1 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/CameraRender.java @@ -0,0 +1,143 @@ +package com.pedro.encoder.input.gl.render; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.opengl.GLES11Ext; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.view.Surface; +import com.pedro.encoder.R; +import com.pedro.encoder.input.video.CameraHelper; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 29/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class CameraRender extends BaseRenderOffScreen { + + private int[] textureID = new int[1]; + private float[] rotationMatrix = new float[16]; + private float[] scaleMatrix = new float[16]; + + private int program = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int aPositionHandle = -1; + private int aTextureCameraHandle = -1; + + private SurfaceTexture surfaceTexture; + private Surface surface; + + public CameraRender() { + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + float[] vertex = CameraHelper.getVerticesData(); + squareVertex = ByteBuffer.allocateDirect(vertex.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(vertex).position(0); + setRotation(0); + setFlip(false, false); + } + + @Override + public void initGl(int width, int height, Context context, int previewWidth, + int previewHeight) { + this.width = width; + this.height = height; + GlUtil.checkGlError("initGl start"); + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.camera_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureCameraHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + + //camera texture + GlUtil.createExternalTextures(1, textureID, 0); + surfaceTexture = new SurfaceTexture(textureID[0]); + surfaceTexture.setDefaultBufferSize(width, height); + surface = new Surface(surfaceTexture); + initFBO(width, height); + GlUtil.checkGlError("initGl end"); + } + + @Override + public void draw() { + GlUtil.checkGlError("drawCamera start"); + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, renderHandler.getFboId()[0]); + + surfaceTexture.getTransformMatrix(STMatrix); + GLES20.glViewport(0, 0, width, height); + GLES20.glUseProgram(program); + GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureCameraHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureCameraHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + //camera + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureID[0]); + //draw + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); + GlUtil.checkGlError("drawCamera end"); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + surfaceTexture = null; + surface = null; + } + + public void updateTexImage() { + surfaceTexture.updateTexImage(); + } + + public SurfaceTexture getSurfaceTexture() { + return surfaceTexture; + } + + public Surface getSurface() { + return surface; + } + + public void setRotation(int rotation) { + Matrix.setIdentityM(rotationMatrix, 0); + Matrix.rotateM(rotationMatrix, 0, rotation, 0f, 0f, -1f); + update(); + } + + public void setFlip(boolean isFlipHorizontal, boolean isFlipVertical) { + Matrix.setIdentityM(scaleMatrix, 0); + Matrix.scaleM(scaleMatrix, 0, isFlipHorizontal ? -1f : 1f, isFlipVertical ? -1f : 1f, 1f); + update(); + } + + private void update() { + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.multiplyMM(MVPMatrix, 0, scaleMatrix, 0, MVPMatrix, 0); + Matrix.multiplyMM(MVPMatrix, 0, rotationMatrix, 0, MVPMatrix, 0); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/ManagerRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/ManagerRender.java new file mode 100644 index 0000000..e3b9ad6 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/ManagerRender.java @@ -0,0 +1,121 @@ +package com.pedro.encoder.input.gl.render; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.os.Build; +import android.view.Surface; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.input.gl.render.filters.BaseFilterRender; +import com.pedro.encoder.input.gl.render.filters.NoFilterRender; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by pedro on 27/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class ManagerRender { + + //Increase it to render more than 1 filter and set filter by position. + // You must modify it before create your rtmp or rtsp object. + public static int numFilters = 1; + + private CameraRender cameraRender; + private List baseFilterRender = new ArrayList<>(numFilters); + private ScreenRender screenRender; + + private int width; + private int height; + private int previewWidth; + private int previewHeight; + private Context context; + + public ManagerRender() { + cameraRender = new CameraRender(); + for (int i = 0; i < numFilters; i++) baseFilterRender.add(new NoFilterRender()); + screenRender = new ScreenRender(); + } + + public void initGl(Context context, int encoderWidth, int encoderHeight, int previewWidth, + int previewHeight) { + this.context = context; + this.width = encoderWidth; + this.height = encoderHeight; + this.previewWidth = previewWidth; + this.previewHeight = previewHeight; + cameraRender.initGl(width, height, context, previewWidth, previewHeight); + for (int i = 0; i < numFilters; i++) { + int textId = i == 0 ? cameraRender.getTexId() : baseFilterRender.get(i - 1).getTexId(); + baseFilterRender.get(i).setPreviousTexId(textId); + baseFilterRender.get(i).initGl(width, height, context, previewWidth, previewHeight); + baseFilterRender.get(i).initFBOLink(); + } + screenRender.setStreamSize(encoderWidth, encoderHeight); + screenRender.setTexId(baseFilterRender.get(numFilters - 1).getTexId()); + screenRender.initGl(context); + } + + public void drawOffScreen() { + cameraRender.draw(); + for (BaseFilterRender baseFilterRender : baseFilterRender) baseFilterRender.draw(); + } + + public void drawScreen(int width, int height, boolean keepAspectRatio, int mode, int rotation, + boolean isPreview) { + screenRender.draw(width, height, keepAspectRatio, mode, rotation, isPreview); + } + + public void release() { + cameraRender.release(); + for (int i = 0; i < this.baseFilterRender.size(); i++) { + this.baseFilterRender.get(i).release(); + this.baseFilterRender.set(i, new NoFilterRender()); + } + screenRender.release(); + } + + public void enableAA(boolean AAEnabled) { + screenRender.setAAEnabled(AAEnabled); + } + + public boolean isAAEnabled() { + return screenRender.isAAEnabled(); + } + + public void updateFrame() { + cameraRender.updateTexImage(); + } + + public SurfaceTexture getSurfaceTexture() { + return cameraRender.getSurfaceTexture(); + } + + public Surface getSurface() { + return cameraRender.getSurface(); + } + + public void setFilter(int position, BaseFilterRender baseFilterRender) { + final int id = this.baseFilterRender.get(position).getPreviousTexId(); + final RenderHandler renderHandler = this.baseFilterRender.get(position).getRenderHandler(); + this.baseFilterRender.get(position).release(); + this.baseFilterRender.set(position, baseFilterRender); + this.baseFilterRender.get(position).setPreviousTexId(id); + this.baseFilterRender.get(position).initGl(width, height, context, previewWidth, previewHeight); + this.baseFilterRender.get(position).setRenderHandler(renderHandler); + } + + public void setCameraRotation(int rotation) { + cameraRender.setRotation(rotation); + } + + public void setCameraFlip(boolean isFlipHorizontal, boolean isFlipVertical) { + cameraRender.setFlip(isFlipHorizontal, isFlipVertical); + } + + public void setPreviewSize(int previewWidth, int previewHeight) { + for (int i = 0; i < this.baseFilterRender.size(); i++) { + this.baseFilterRender.get(i).setPreviewSize(previewWidth, previewHeight); + } + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/RenderHandler.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/RenderHandler.java new file mode 100644 index 0000000..d40bac4 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/RenderHandler.java @@ -0,0 +1,36 @@ +package com.pedro.encoder.input.gl.render; + +/** + * Created by pedro on 25/7/18. + */ + +public class RenderHandler { + + private int[] fboId = new int[] { 0 }; + private int[] rboId = new int[] { 0 }; + private int[] texId = new int[] { 0 }; + + public int[] getTexId() { + return texId; + } + + public int[] getFboId() { + return fboId; + } + + public int[] getRboId() { + return rboId; + } + + public void setFboId(int[] fboId) { + this.fboId = fboId; + } + + public void setRboId(int[] rboId) { + this.rboId = rboId; + } + + public void setTexId(int[] texId) { + this.texId = texId; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/ScreenRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/ScreenRender.java new file mode 100644 index 0000000..f667d2d --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/ScreenRender.java @@ -0,0 +1,139 @@ +package com.pedro.encoder.input.gl.render; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.input.video.CameraHelper; +import com.pedro.encoder.utils.gl.GlUtil; +import com.pedro.encoder.utils.gl.SizeCalculator; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +/** + * Created by pedro on 29/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class ScreenRender { + + //rotation matrix + private final float[] squareVertexData = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private FloatBuffer squareVertex; + + private float[] MVPMatrix = new float[16]; + private float[] STMatrix = new float[16]; + private boolean AAEnabled = false; //FXAA enable/disable + + private int texId; + + private int program = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uSamplerHandle = -1; + private int uResolutionHandle = -1; + private int uAAEnabledHandle = -1; + + private int streamWidth; + private int streamHeight; + private boolean isPortrait; + + public ScreenRender() { + squareVertex = + ByteBuffer.allocateDirect(squareVertexData.length * BaseRenderOffScreen.FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexData).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + public void initGl(Context context) { + isPortrait = CameraHelper.isPortrait(context); + GlUtil.checkGlError("initGl start"); + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.fxaa); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); + uAAEnabledHandle = GLES20.glGetUniformLocation(program, "uAAEnabled"); + GlUtil.checkGlError("initGl end"); + } + + public void draw(int width, int height, boolean keepAspectRatio, int mode, int rotation, + boolean isPreview) { + GlUtil.checkGlError("drawScreen start"); + + if (mode == 2 || mode == 3) { //stream rotation is enabled + SizeCalculator.updateMatrix(rotation, width, height, isPreview, isPortrait, MVPMatrix); + } + SizeCalculator.calculateViewPort(keepAspectRatio, mode, width, height, streamWidth, + streamHeight); + + GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); + + GLES20.glUseProgram(program); + + squareVertex.position(BaseRenderOffScreen.SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + BaseRenderOffScreen.SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(BaseRenderOffScreen.SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + BaseRenderOffScreen.SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform2f(uResolutionHandle, width, height); + GLES20.glUniform1f(uAAEnabledHandle, AAEnabled ? 1f : 0f); + + GLES20.glUniform1i(uSamplerHandle, 5); + GLES20.glActiveTexture(GLES20.GL_TEXTURE5); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId); + //draw + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + + GlUtil.checkGlError("drawScreen end"); + } + + public void release() { + GLES20.glDeleteProgram(program); + } + + public void setTexId(int texId) { + this.texId = texId; + } + + public void setAAEnabled(boolean AAEnabled) { + this.AAEnabled = AAEnabled; + } + + public boolean isAAEnabled() { + return AAEnabled; + } + + public void setStreamSize(int streamWidth, int streamHeight) { + this.streamWidth = streamWidth; + this.streamHeight = streamHeight; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/SimpleCameraRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/SimpleCameraRender.java new file mode 100644 index 0000000..7893ef9 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/SimpleCameraRender.java @@ -0,0 +1,168 @@ +package com.pedro.encoder.input.gl.render; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.opengl.GLES11Ext; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.view.Surface; +import com.pedro.encoder.R; +import com.pedro.encoder.input.video.CameraHelper; +import com.pedro.encoder.utils.gl.GlUtil; +import com.pedro.encoder.utils.gl.SizeCalculator; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +/** + * Created by pedro on 21/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class SimpleCameraRender { + public final static String TAG = "SimpleCameraRender"; + + private static final int FLOAT_SIZE_BYTES = 4; + private static final int SQUARE_VERTEX_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES; + private static final int SQUARE_VERTEX_DATA_POS_OFFSET = 0; + private static final int SQUARE_VERTEX_DATA_UV_OFFSET = 3; + + private FloatBuffer squareVertex; + + private float[] MVPMatrix = new float[16]; + private float[] STMatrix = new float[16]; + private float[] rotationMatrix = new float[16]; + private float[] scaleMatrix = new float[16]; + + private int[] texturesID = new int[1]; + + private int program = -1; + private int textureID = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int aPositionHandle = -1; + private int aTextureCoordHandle = -1; + + private SurfaceTexture surfaceTexture; + private Surface surface; + private int streamWidth; + private int streamHeight; + private boolean isPortrait; + + public SimpleCameraRender() { + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + float[] vertex = CameraHelper.getVerticesData(); + squareVertex = ByteBuffer.allocateDirect(vertex.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(vertex).position(0); + setRotation(0); + setFlip(false, false); + } + + public void setRotation(int rotation) { + Matrix.setIdentityM(rotationMatrix, 0); + Matrix.rotateM(rotationMatrix, 0, rotation, 0f, 0f, -1f); + update(); + } + + public int getTextureId() { + return textureID; + } + + public SurfaceTexture getSurfaceTexture() { + return surfaceTexture; + } + + public Surface getSurface() { + return surface; + } + + public void updateFrame() { + surfaceTexture.updateTexImage(); + } + + public void drawFrame(int width, int height, boolean keepAspectRatio, int mode, int rotation, + boolean isPreview) { + GlUtil.checkGlError("drawFrame start"); + surfaceTexture.getTransformMatrix(STMatrix); + + if (mode == 2 || mode == 3) { //stream rotation is enabled + SizeCalculator.updateMatrix(rotation, width, height, isPreview, isPortrait, MVPMatrix); + } + SizeCalculator.calculateViewPort(keepAspectRatio, mode, width, height, streamWidth, + streamHeight); + + GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); + + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureCoordHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureCoordHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + //camera + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureID); + //draw + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + GlUtil.checkGlError("drawFrame end"); + } + + /** + * Initializes GL state. Call this after the EGL surface has been created and made current. + */ + public void initGl(Context context, int streamWidth, int streamHeight) { + isPortrait = CameraHelper.isPortrait(context); + this.streamWidth = streamWidth; + this.streamHeight = streamHeight; + GlUtil.checkGlError("initGl start"); + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.camera_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureCoordHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + + //camera texture + GlUtil.createExternalTextures(1, texturesID, 0); + textureID = texturesID[0]; + + surfaceTexture = new SurfaceTexture(textureID); + surfaceTexture.setDefaultBufferSize(streamWidth, streamHeight); + surface = new Surface(surfaceTexture); + GlUtil.checkGlError("initGl end"); + } + + public void release() { + GLES20.glDeleteProgram(program); + surfaceTexture = null; + surface = null; + } + + public void setFlip(boolean isFlipHorizontal, boolean isFlipVertical) { + Matrix.setIdentityM(scaleMatrix, 0); + Matrix.scaleM(scaleMatrix, 0, isFlipHorizontal ? -1f : 1f, isFlipVertical ? -1f : 1f, 1f); + update(); + } + + private void update() { + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.multiplyMM(MVPMatrix, 0, scaleMatrix, 0, MVPMatrix, 0); + Matrix.multiplyMM(MVPMatrix, 0, rotationMatrix, 0, MVPMatrix, 0); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/AnalogTVFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/AnalogTVFilterRender.java new file mode 100644 index 0000000..6d4f9a9 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/AnalogTVFilterRender.java @@ -0,0 +1,96 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; + +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import androidx.annotation.RequiresApi; + +/** + * Created by pedro on 09/09/19. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class AnalogTVFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uTimeHandle = -1; + private int uResolutionHandle = -1; + + private long START_TIME = System.currentTimeMillis(); + + public AnalogTVFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.analog_tv_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uTimeHandle = GLES20.glGetUniformLocation(program, "uTime"); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + float time = ((float) (System.currentTimeMillis() - START_TIME)) / 1000f; + if (time >= 10) START_TIME += 10000; + GLES20.glUniform1f(uTimeHandle, time); + GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight()); + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} \ No newline at end of file diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/AndroidViewFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/AndroidViewFilterRender.java new file mode 100644 index 0000000..38371ba --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/AndroidViewFilterRender.java @@ -0,0 +1,219 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.SurfaceTexture; +import android.opengl.GLES11Ext; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.view.Surface; +import android.view.View; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import com.pedro.encoder.utils.gl.TranslateTo; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class AndroidViewFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uSamplerViewHandle = -1; + + private int[] viewId = new int[1]; + private View view; + private SurfaceTexture surfaceTexture; + private Surface surface; + private Handler mainHandler; + + private int rotation; + private float positionX, positionY; + private float scaleX = 1f, scaleY = 1f; + private float viewX, viewY; + + public AndroidViewFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + mainHandler = new Handler(Looper.getMainLooper()); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.android_view_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uSamplerViewHandle = GLES20.glGetUniformLocation(program, "uSamplerView"); + + GlUtil.createExternalTextures(1, viewId, 0); + surfaceTexture = new SurfaceTexture(viewId[0]); + surface = new Surface(surfaceTexture); + } + + @Override + protected void drawFilter() { + surfaceTexture.setDefaultBufferSize(getPreviewWidth(), getPreviewHeight()); + if (view != null) { + mainHandler.post(new Runnable() { + @Override + public void run() { + Canvas canvas = surface.lockCanvas(null); + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + canvas.translate(positionX, positionY); + canvas.rotate(rotation, viewX / 2f, viewY / 2f); + float scaleFactorX = (float) getPreviewWidth() / (float) view.getWidth(); + float scaleFactorY = (float) getPreviewHeight() / (float) view.getHeight(); + canvas.scale(scaleX * scaleFactorX, scaleY * scaleFactorY); + view.draw(canvas); + surface.unlockCanvasAndPost(canvas); + } + }); + } + surfaceTexture.updateTexImage(); + + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + //android view + GLES20.glUniform1i(uSamplerViewHandle, 5); + GLES20.glActiveTexture(GLES20.GL_TEXTURE5); + GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, viewId[0]); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public View getView() { + return view; + } + + public void setView(final View view) { + this.view = view; + if (view != null) { + view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + viewX = view.getMeasuredWidth(); + viewY = view.getMeasuredHeight(); + } + } + + /** + * + * @param x Position in percent + * @param y Position in percent + */ + public void setPosition(float x, float y) { + int previewX = getPreviewWidth(); + int previewY = getPreviewHeight(); + this.positionX = previewX * x / 100f; + this.positionY = previewY * y / 100f; + } + + public void setPosition(TranslateTo positionTo) { + int previewX = getPreviewWidth(); + int previewY = getPreviewHeight(); + switch (positionTo) { + case TOP: + this.positionX = previewX / 2f - (viewX / 2f); + this.positionY = 0f; + break; + case LEFT: + this.positionX = 0; + this.positionY = previewY / 2f - (viewY / 2f); + break; + case RIGHT: + this.positionX = previewX - viewX; + this.positionY = previewY / 2f - (viewY / 2f); + break; + case BOTTOM: + this.positionX = previewX / 2f - (viewX / 2f); + this.positionY = previewY - viewY; + break; + case CENTER: + this.positionX = previewX / 2f - (viewX / 2f); + this.positionY = previewY / 2f - (viewY / 2f); + break; + case TOP_RIGHT: + this.positionX = previewX - viewX; + this.positionY = 0; + break; + case BOTTOM_LEFT: + this.positionX = 0; + this.positionY = previewY - viewY; + break; + case BOTTOM_RIGHT: + this.positionX = previewX - viewX; + this.positionY = previewY - viewY; + break; + case TOP_LEFT: + default: + this.positionX = 0; + this.positionY = 0; + break; + } + } + + public void setRotation(int rotation) { + if (rotation < 0) { + this.rotation = 0; + } else if (rotation > 360) { + this.rotation = 360; + } else { + this.rotation = rotation; + } + } + + public void setScale(float scaleX, float scaleY) { + this.scaleX = scaleX; + this.scaleY = scaleY; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BaseFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BaseFilterRender.java new file mode 100644 index 0000000..b289bd2 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BaseFilterRender.java @@ -0,0 +1,96 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.input.gl.render.BaseRenderOffScreen; +import com.pedro.encoder.input.gl.render.RenderHandler; +import com.pedro.encoder.utils.gl.GlUtil; + +/** + * Created by pedro on 29/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public abstract class BaseFilterRender extends BaseRenderOffScreen { + + private int width; + private int height; + private int previewWidth; + private int previewHeight; + + protected int previousTexId; + private RenderHandler renderHandler = new RenderHandler(); + + public void initGl(int width, int height, Context context, int previewWidth, int previewHeight) { + this.width = width; + this.height = height; + this.previewWidth = previewWidth; + this.previewHeight = previewHeight; + GlUtil.checkGlError("initGl start"); + initGlFilter(context); + GlUtil.checkGlError("initGl end"); + } + + public void setPreviewSize(int previewWidth, int previewHeight) { + this.previewWidth = previewWidth; + this.previewHeight = previewHeight; + } + + public void initFBOLink() { + initFBO(width, height, renderHandler.getFboId(), renderHandler.getRboId(), + renderHandler.getTexId()); + } + + protected abstract void initGlFilter(Context context); + + public void draw() { + GlUtil.checkGlError("drawFilter start"); + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, renderHandler.getFboId()[0]); + GLES20.glViewport(0, 0, width, height); + drawFilter(); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); + GlUtil.checkGlError("drawFilter end"); + } + + protected abstract void drawFilter(); + + public void setPreviousTexId(int texId) { + this.previousTexId = texId; + } + + @Override + public int getTexId() { + return renderHandler.getTexId()[0]; + } + + protected int getWidth() { + return width; + } + + protected int getHeight() { + return height; + } + + public int getPreviewWidth() { + return previewWidth; + } + + public int getPreviewHeight() { + return previewHeight; + } + + public int getPreviousTexId() { + return previousTexId; + } + + public RenderHandler getRenderHandler() { + return renderHandler; + } + + public void setRenderHandler(RenderHandler renderHandler) { + this.renderHandler = renderHandler; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BasicDeformationFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BasicDeformationFilterRender.java new file mode 100644 index 0000000..fe09d45 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BasicDeformationFilterRender.java @@ -0,0 +1,91 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class BasicDeformationFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uTimeHandle = -1; + + private long START_TIME = System.currentTimeMillis(); + + public BasicDeformationFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.basic_deformation_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uTimeHandle = GLES20.glGetUniformLocation(program, "uTime"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + float time = ((float) (System.currentTimeMillis() - START_TIME)) / 1000f; + if (time >= 10) START_TIME += 10000; + GLES20.glUniform1f(uTimeHandle, time); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BeautyFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BeautyFilterRender.java new file mode 100644 index 0000000..f9f0ab2 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BeautyFilterRender.java @@ -0,0 +1,87 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 7/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class BeautyFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uResolutionHandle = -1; + + public BeautyFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.beauty_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform2f(uResolutionHandle, 2f / getWidth(), 2f / getHeight()); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BlackFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BlackFilterRender.java new file mode 100644 index 0000000..e71db41 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BlackFilterRender.java @@ -0,0 +1,85 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 29/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class BlackFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + + public BlackFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.black_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} + diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BlurFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BlurFilterRender.java new file mode 100644 index 0000000..5b2e88d --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BlurFilterRender.java @@ -0,0 +1,112 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class BlurFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uBlurHandle = -1; + private int uRadiusHandle = -1; + + private float blur = 10f; + private float radius = 0.03f; + + public BlurFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.blur_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uBlurHandle = GLES20.glGetUniformLocation(program, "uBlur"); + uRadiusHandle = GLES20.glGetUniformLocation(program, "uRadius"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform1f(uBlurHandle, blur); + GLES20.glUniform1f(uRadiusHandle, radius); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public int getBlur() { + return (int) blur; + } + + /** + * @param blur Range should be between 0 or more. Not recommended more than 20 + */ + public void setBlur(int blur) { + this.blur = blur; + } + + public float getRadius() { + return radius; + } + + public void setRadius(float radius) { + this.radius = radius; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BrightnessFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BrightnessFilterRender.java new file mode 100644 index 0000000..74f870c --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/BrightnessFilterRender.java @@ -0,0 +1,100 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 31/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class BrightnessFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uBrightnessHandle = -1; + + private float brightness = 0.5f; + + public BrightnessFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.brightness_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uBrightnessHandle = GLES20.glGetUniformLocation(program, "uBrightness"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform1f(uBrightnessHandle, brightness); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getBrightness() { + return brightness; + } + + /** + * @param brightness Range should be between 0.1 - 2.0 with 1.0 being normal. + */ + public void setBrightness(float brightness) { + this.brightness = brightness; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/CartoonFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/CartoonFilterRender.java new file mode 100644 index 0000000..6b6175c --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/CartoonFilterRender.java @@ -0,0 +1,97 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class CartoonFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uCartoonHandle = -1; + + private float cartoon = 0.007f; + + public CartoonFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.cartoon_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uCartoonHandle = GLES20.glGetUniformLocation(program, "uCartoon"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform1f(uCartoonHandle, cartoon); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getCartoon() { + return cartoon; + } + + public void setCartoon(float cartoon) { + this.cartoon = cartoon; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/CircleFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/CircleFilterRender.java new file mode 100644 index 0000000..7754a8c --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/CircleFilterRender.java @@ -0,0 +1,114 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 01/02/19. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class CircleFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uCenterHandle = -1; + private int uRadiusHandle = -1; + private int uResolutionHandle = -1; + + private float xCenter = 0.5f; + private float yCenter = 0.5f; + private float radius = 0.5f; + + public CircleFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.circle_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uCenterHandle = GLES20.glGetUniformLocation(program, "uCenter"); + uRadiusHandle = GLES20.glGetUniformLocation(program, "uRadius"); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1f(uRadiusHandle, radius); + GLES20.glUniform2f(uCenterHandle, xCenter, yCenter); + GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight()); + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + /** + * @param x in openglview percent (0 to 100) + * @param y in openglview percent (0 to 100) + */ + public void setCenter(float x, float y) { + xCenter = x / 100; + yCenter = y / 100; + } + + /** + * + * @param radius in openglview percent (0 to 100) + */ + public void setRadius(float radius) { + this.radius = radius / 100; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ColorFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ColorFilterRender.java new file mode 100644 index 0000000..93e0c0b --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ColorFilterRender.java @@ -0,0 +1,145 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.content.res.Resources; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by pedro on 30/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class ColorFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uColorHandle = -1; + + private static final String HEX_PATTERN = "^#([A-Fa-f0-9]{6})$"; + + //by default tint with blue + private float red = 0f; + private float green = 0f; + private float blue = 1f; + + public ColorFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.color_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uColorHandle = GLES20.glGetUniformLocation(program, "uColor"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform3f(uColorHandle, red, green, blue); + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getRed() { + return red; + } + + public float getGreen() { + return green; + } + + public float getBlue() { + return blue; + } + + /** + * @param rgbHexColor color represented with 7 characters (1 to start with #, 2 for red, 2 for + * green and 2 for blue) + */ + public void setRGBColor(String rgbHexColor) { + Pattern pattern = Pattern.compile(HEX_PATTERN); + Matcher matcher = pattern.matcher(rgbHexColor); + if (!matcher.matches()) { + throw new IllegalArgumentException( + "Invalid hexColor pattern (Should be: " + HEX_PATTERN + ")"); + } + int r = Integer.valueOf(rgbHexColor.substring(1, 3), 16); + int g = Integer.valueOf(rgbHexColor.substring(3, 5), 16); + int b = Integer.valueOf(rgbHexColor.substring(5, 7), 16); + red = (float) r / 255.0f; + green = (float) g / 255.0f; + blue = (float) b / 255.0f; + } + + /** + * Values range 0 to 255 + */ + public void setRGBColor(int r, int g, int b) { + red = (float) r / 255.0f; + green = (float) g / 255.0f; + blue = (float) b / 255.0f; + } + + /** + * Get string color from color file resource and strip alpha values (alpha values is always auto + * completed) + */ + public void setColor(Resources resources, int colorResource) { + String color = resources.getString(colorResource); + setRGBColor("#" + color.substring(3)); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ContrastFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ContrastFilterRender.java new file mode 100644 index 0000000..33bf042 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ContrastFilterRender.java @@ -0,0 +1,100 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 31/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class ContrastFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uContrastHandle = -1; + + private float contrast = 0.5f; + + public ContrastFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.contrast_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uContrastHandle = GLES20.glGetUniformLocation(program, "uContrast"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform1f(uContrastHandle, contrast); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getContrast() { + return contrast; + } + + /** + * @param contrast Range should be between 0.1 - 2.0 with 1.0 being normal. + */ + public void setContrast(float contrast) { + this.contrast = contrast; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/DuotoneFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/DuotoneFilterRender.java new file mode 100644 index 0000000..afed198 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/DuotoneFilterRender.java @@ -0,0 +1,198 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Color; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by pedro on 1/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class DuotoneFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uColorHandle = -1; + private int uColor2Handle = -1; + + private static final String HEX_PATTERN = "^#([A-Fa-f0-9]{6})$"; + + //by default tint with green and blue + private float red = 0f; + private float green = 1f; + private float blue = 0f; + private float red2 = 0f; + private float green2 = 0f; + private float blue2 = 1f; + + public DuotoneFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.duotone_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uColorHandle = GLES20.glGetUniformLocation(program, "uColor"); + uColor2Handle = GLES20.glGetUniformLocation(program, "uColor2"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform3f(uColorHandle, red, green, blue); + GLES20.glUniform3f(uColor2Handle, red2, green2, blue2); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getRed() { + return red; + } + + public float getGreen() { + return green; + } + + public float getBlue() { + return blue; + } + + public float getRed2() { + return red2; + } + + public float getGreen2() { + return green2; + } + + public float getBlue2() { + return blue2; + } + + /** + * @param rgbHexColor color represented with 7 characters (1 to start with #, 2 for red, 2 for + * green and 2 for blue) + */ + public void setRGBColor(String rgbHexColor, String rgbHexColor2) { + Pattern pattern = Pattern.compile(HEX_PATTERN); + Matcher matcher = pattern.matcher(rgbHexColor); + if (!matcher.matches()) { + throw new IllegalArgumentException( + "Invalid hexColor pattern (Should be: " + HEX_PATTERN + ")"); + } + int r = Integer.valueOf(rgbHexColor.substring(1, 3), 16); + int g = Integer.valueOf(rgbHexColor.substring(3, 5), 16); + int b = Integer.valueOf(rgbHexColor.substring(5, 7), 16); + red = (float) r / 255.0f; + green = (float) g / 255.0f; + blue = (float) b / 255.0f; + + matcher = pattern.matcher(rgbHexColor2); + if (!matcher.matches()) { + throw new IllegalArgumentException( + "Invalid hexColor pattern (Should be: " + HEX_PATTERN + ")"); + } + r = Integer.valueOf(rgbHexColor2.substring(1, 3), 16); + g = Integer.valueOf(rgbHexColor2.substring(3, 5), 16); + b = Integer.valueOf(rgbHexColor2.substring(5, 7), 16); + red2 = (float) r / 255.0f; + green2 = (float) g / 255.0f; + blue2 = (float) b / 255.0f; + } + + /** + * Values range 0 to 255 + */ + public void setRGBColor(int r, int g, int b, int r2, int g2, int b2) { + red = (float) r / 255.0f; + green = (float) g / 255.0f; + blue = (float) b / 255.0f; + + red2 = (float) r2 / 255.0f; + green2 = (float) g2 / 255.0f; + blue2 = (float) b2 / 255.0f; + } + + /** + * Get string color from color file resource and strip alpha values (alpha values is always auto + * completed) + */ + public void setColor(Resources resources, int colorResource, int colorResource2) { + String color = resources.getString(colorResource); + String color2 = resources.getString(colorResource2); + setRGBColor("#" + color.substring(3), "#" + color2.substring(3)); + } + + /** + * @param colorResource int from color class with Color.parse or Color.NAME_COLOR (Ex: + * Color.BLUE) + * @param colorResource2 int from color class with Color.parse or Color.NAME_COLOR (Ex: + * Color.BLUE) + */ + public void setColor(int colorResource, int colorResource2) { + red = Color.red(colorResource) / 255f; + green = Color.green(colorResource) / 255f; + blue = Color.blue(colorResource) / 255f; + + red2 = Color.red(colorResource2) / 255f; + green2 = Color.green(colorResource2) / 255f; + blue2 = Color.blue(colorResource2) / 255f; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/EarlyBirdFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/EarlyBirdFilterRender.java new file mode 100644 index 0000000..b373008 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/EarlyBirdFilterRender.java @@ -0,0 +1,87 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class EarlyBirdFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uResolutionHandle = -1; + + public EarlyBirdFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.earlybird_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight()); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/EdgeDetectionFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/EdgeDetectionFilterRender.java new file mode 100644 index 0000000..6263d67 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/EdgeDetectionFilterRender.java @@ -0,0 +1,84 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class EdgeDetectionFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + + public EdgeDetectionFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.edge_detection_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ExposureFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ExposureFilterRender.java new file mode 100644 index 0000000..0cccab4 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ExposureFilterRender.java @@ -0,0 +1,97 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 31/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class ExposureFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uExposureHandle = -1; + + private float exposure = 0.5f; + + public ExposureFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.exposure_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uExposureHandle = GLES20.glGetUniformLocation(program, "uExposure"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform1f(uExposureHandle, exposure); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getExposure() { + return exposure; + } + + public void setExposure(float exposure) { + this.exposure = exposure; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/FireFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/FireFilterRender.java new file mode 100644 index 0000000..d1f6d7a --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/FireFilterRender.java @@ -0,0 +1,87 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class FireFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uResolutionHandle = -1; + + public FireFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.fire_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight()); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/GammaFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/GammaFilterRender.java new file mode 100644 index 0000000..9c71e38 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/GammaFilterRender.java @@ -0,0 +1,100 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 2/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class GammaFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uGammaHandle = -1; + + private float gamma = 0.5f; + + public GammaFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.gamma_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uGammaHandle = GLES20.glGetUniformLocation(program, "uGamma"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform1f(uGammaHandle, gamma); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getGamma() { + return gamma; + } + + /** + * @param gamma Range should be between 0.0 - 2.0 with 1.0 being normal. + */ + public void setGamma(float gamma) { + this.gamma = gamma; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/GlitchFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/GlitchFilterRender.java new file mode 100644 index 0000000..987396f --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/GlitchFilterRender.java @@ -0,0 +1,90 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 19/12/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class GlitchFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uTimeHandle = -1; + + private long START_TIME = System.currentTimeMillis(); + + public GlitchFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.glitch_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uTimeHandle = GLES20.glGetUniformLocation(program, "uTime"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + float time = ((float) (System.currentTimeMillis() - START_TIME)) / 1000.0f; + GLES20.glUniform1f(uTimeHandle, time); + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} + diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/GreyScaleFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/GreyScaleFilterRender.java new file mode 100644 index 0000000..bc1608c --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/GreyScaleFilterRender.java @@ -0,0 +1,84 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 29/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class GreyScaleFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + + public GreyScaleFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.grey_scale_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/HalftoneLinesFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/HalftoneLinesFilterRender.java new file mode 100644 index 0000000..f401026 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/HalftoneLinesFilterRender.java @@ -0,0 +1,157 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class HalftoneLinesFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uResolutionHandle = -1; + private int uModeHandle = -1; + private int uRowsHandle = -1; + private int uRotationHandle = -1; + private int uAntialiasHandle = -1; + private int uSampleDistHandle = -1; + + private float mode = 1f; + private float rows = 40f; + private float rotation = 0f; + private float antialias = 0.2f; + private float[] sampleDist = new float[] { 2f, 2f }; + + public HalftoneLinesFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.halftone_lines_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); + uModeHandle = GLES20.glGetUniformLocation(program, "uMode"); + uRowsHandle = GLES20.glGetUniformLocation(program, "uRows"); + uRotationHandle = GLES20.glGetUniformLocation(program, "uRotation"); + uAntialiasHandle = GLES20.glGetUniformLocation(program, "uAntialias"); + uSampleDistHandle = GLES20.glGetUniformLocation(program, "uSampleDist"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight()); + GLES20.glUniform1f(uModeHandle, mode); + GLES20.glUniform1f(uRowsHandle, rows); + GLES20.glUniform1f(uRotationHandle, rotation); + GLES20.glUniform1f(uAntialiasHandle, antialias); + GLES20.glUniform2f(uSampleDistHandle, sampleDist[0], sampleDist[1]); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getMode() { + return mode; + } + + public float getRows() { + return rows; + } + + public float getRotation() { + return rotation; + } + + public float getAntialias() { + return antialias; + } + + public float[] getSampleDist() { + return sampleDist; + } + + /** + * @param mode 1 to 7 values + */ + public void setMode(int mode) { + if (mode < 1) { + this.mode = 1; + } else if (mode > 7) { + this.mode = 7; + } else { + this.mode = mode; + } + } + + public void setRows(float rows) { + this.rows = rows; + } + + public void setRotation(float rotation) { + this.rotation = rotation; + } + + public void setAntialias(float antialias) { + this.antialias = antialias; + } + + public void setSampleDist(float[] sampleDist) { + this.sampleDist = sampleDist; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/Image70sFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/Image70sFilterRender.java new file mode 100644 index 0000000..01815d3 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/Image70sFilterRender.java @@ -0,0 +1,84 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class Image70sFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + + public Image70sFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.image70s_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/LamoishFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/LamoishFilterRender.java new file mode 100644 index 0000000..4cd9db1 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/LamoishFilterRender.java @@ -0,0 +1,84 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 3/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class LamoishFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + + public LamoishFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.lamoish_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/MoneyFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/MoneyFilterRender.java new file mode 100644 index 0000000..06f90b2 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/MoneyFilterRender.java @@ -0,0 +1,87 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class MoneyFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uResolutionHandle = -1; + + public MoneyFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.money_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight()); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/NegativeFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/NegativeFilterRender.java new file mode 100644 index 0000000..cde1abb --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/NegativeFilterRender.java @@ -0,0 +1,84 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 29/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class NegativeFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + + public NegativeFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.negative_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/NoFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/NoFilterRender.java new file mode 100644 index 0000000..266413e --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/NoFilterRender.java @@ -0,0 +1,84 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 29/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class NoFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + + public NoFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.simple_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/PixelatedFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/PixelatedFilterRender.java new file mode 100644 index 0000000..fd8f870 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/PixelatedFilterRender.java @@ -0,0 +1,106 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 31/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class PixelatedFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uPixelatedHandle = -1; + + private float pixelated = 0.01f; + + public PixelatedFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.pixelated_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uPixelatedHandle = GLES20.glGetUniformLocation(program, "uPixelated"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform1f(uPixelatedHandle, pixelated); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getPixelated() { + return pixelated; + } + + /** + * @param pixelated min value 0.0f, max value 1.0f + */ + public void setPixelated(float pixelated) { + if (pixelated > 1.0f) { + this.pixelated = 1.0f; + } else if (pixelated < 0.0f) { + this.pixelated = 0.0f; + } else { + this.pixelated = pixelated; + } + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/PolygonizationFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/PolygonizationFilterRender.java new file mode 100644 index 0000000..680cb1b --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/PolygonizationFilterRender.java @@ -0,0 +1,87 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class PolygonizationFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uResolutionHandle = -1; + + public PolygonizationFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.polygonization_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight()); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RGBSaturationFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RGBSaturationFilterRender.java new file mode 100644 index 0000000..ac1b2d6 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RGBSaturationFilterRender.java @@ -0,0 +1,110 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 18/07/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class RGBSaturationFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uRGBSaturationHandle = -1; + + private float r = 1f, g = 1f, b = 1f; + + public RGBSaturationFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.rgb_saturation_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uRGBSaturationHandle = GLES20.glGetUniformLocation(program, "uRGBSaturation"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform3f(uRGBSaturationHandle, r, g, b); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getR() { + return r; + } + + public float getG() { + return g; + } + + public float getB() { + return b; + } + + /** + * Saturate red, green and blue colors 0% to 100% (0.0f to 1.0f) + */ + public void setRGBSaturation(float r, float g, float b) { + this.r = r; + this.g = g; + this.b = b; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RainbowFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RainbowFilterRender.java new file mode 100644 index 0000000..ee1edae --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RainbowFilterRender.java @@ -0,0 +1,89 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class RainbowFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uTimeHandle = -1; + + private long START_TIME = System.currentTimeMillis(); + + public RainbowFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.rainbow_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uTimeHandle = GLES20.glGetUniformLocation(program, "uTime"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + float time = ((float) (System.currentTimeMillis() - START_TIME)) / 1000.0f; + GLES20.glUniform1f(uTimeHandle, time); + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RippleFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RippleFilterRender.java new file mode 100644 index 0000000..7d0c32d --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RippleFilterRender.java @@ -0,0 +1,97 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 2/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class RippleFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uResolutionHandle = -1; + private int uSpeedHandle = -1; + private int uTimeHandle = -1; + + private float speed = 15f; + private long START_TIME = System.currentTimeMillis(); + + public RippleFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.ripple_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); + uSpeedHandle = GLES20.glGetUniformLocation(program, "uSpeed"); + uTimeHandle = GLES20.glGetUniformLocation(program, "uTime"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight()); + GLES20.glUniform1f(uSpeedHandle, speed); + float time = ((float) (System.currentTimeMillis() - START_TIME)) / 1000f; + if (time >= 10) START_TIME += 10000; + GLES20.glUniform1f(uTimeHandle, time); + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RotationFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RotationFilterRender.java new file mode 100644 index 0000000..77fe94a --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/RotationFilterRender.java @@ -0,0 +1,105 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 9/07/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class RotationFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + + private int rotation = 0; + private float[] rotationMatrix = new float[16]; + + public RotationFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + Matrix.setIdentityM(rotationMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.simple_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + } + + @Override + protected void drawFilter() { + GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); + + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public int getRotation() { + return rotation; + } + + public void setRotation(int rotation) { + this.rotation = rotation; + //Set rotation + Matrix.setRotateM(rotationMatrix, 0, rotation, 0, 0, 1.0f); + //Translation + //Matrix.translateM(rotationMatrix, 0, 0f, 0f, 0f); + // Combine the rotation matrix with the projection and camera view + Matrix.multiplyMM(MVPMatrix, 0, rotationMatrix, 0, MVPMatrix, 0); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SaturationFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SaturationFilterRender.java new file mode 100644 index 0000000..cdd2376 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SaturationFilterRender.java @@ -0,0 +1,120 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 1/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class SaturationFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uShiftHandle = -1; + private int uWeightsHandle = -1; + private int uExponentsHandle = -1; + private int uSaturationHandle = -1; + + private float saturation = -0.5f; + private final float shift = 1.0f / 255.0f; + private final float weights[] = { 2f / 8f, 5f / 8f, 1f / 8f }; + private float exponents[] = new float[3]; + + public SaturationFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.saturation_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uShiftHandle = GLES20.glGetUniformLocation(program, "uShift"); + uWeightsHandle = GLES20.glGetUniformLocation(program, "uWeights"); + uExponentsHandle = GLES20.glGetUniformLocation(program, "uExponents"); + uSaturationHandle = GLES20.glGetUniformLocation(program, "uSaturation"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform1f(uShiftHandle, shift); + GLES20.glUniform3f(uWeightsHandle, weights[0], weights[1], weights[2]); + GLES20.glUniform3f(uExponentsHandle, exponents[0], exponents[1], exponents[2]); + GLES20.glUniform1f(uSaturationHandle, saturation); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getSaturation() { + return saturation; + } + + /** + * @param saturation between -1.0f and 1.0f means no change, while -1.0f indicates full desaturation, + * i.e. grayscale. + */ + public void setSaturation(float saturation) { + if (saturation > 0.0f) { + exponents[0] = (0.9f * saturation) + 1.0f; + exponents[1] = (2.1f * saturation) + 1.0f; + exponents[2] = (2.7f * saturation) + 1.0f; + this.saturation = saturation; + } else { + this.saturation = saturation + 1.0f; + } + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SepiaFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SepiaFilterRender.java new file mode 100644 index 0000000..98de0d1 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SepiaFilterRender.java @@ -0,0 +1,84 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 29/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class SepiaFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + + public SepiaFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.sepia_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SharpnessFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SharpnessFilterRender.java new file mode 100644 index 0000000..993fb8f --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SharpnessFilterRender.java @@ -0,0 +1,103 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 3/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class SharpnessFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uStepSizeHandle = -1; + private int uSharpnessHandle = -1; + + private float sharpness = 0.5f; + + public SharpnessFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.sharpness_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uStepSizeHandle = GLES20.glGetUniformLocation(program, "uStepSize"); + uSharpnessHandle = GLES20.glGetUniformLocation(program, "uBrightness"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform2f(uStepSizeHandle, 1f / getWidth(), 1f / getHeight()); + GLES20.glUniform1f(uSharpnessHandle, sharpness); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getSharpness() { + return sharpness; + } + + /** + * @param sharpness between 0 and 1. 0 means no change. + */ + public void setSharpness(float sharpness) { + this.sharpness = sharpness; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SnowFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SnowFilterRender.java new file mode 100644 index 0000000..75d664e --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SnowFilterRender.java @@ -0,0 +1,116 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.input.gl.TextureLoader; +import com.pedro.encoder.utils.gl.GlUtil; +import com.pedro.encoder.utils.gl.ImageStreamObject; +import com.pedro.encoder.utils.gl.StreamObjectBase; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 19/12/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class SnowFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uTimeHandle = -1; + private int uSnowHandle = -1; + + private long START_TIME = System.currentTimeMillis(); + private TextureLoader textureLoader = new TextureLoader(); + private StreamObjectBase streamObjectBase; + private int[] snowTextureId = new int[] { -1 }; + + public SnowFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.snow_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uTimeHandle = GLES20.glGetUniformLocation(program, "uTime"); + uSnowHandle = GLES20.glGetUniformLocation(program, "uSnow"); + Bitmap snowBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.snow_flakes); + streamObjectBase = new ImageStreamObject(); + ((ImageStreamObject) streamObjectBase).load(snowBitmap); + snowTextureId = textureLoader.load(streamObjectBase.getBitmaps()); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + float time = ((float) (System.currentTimeMillis() - START_TIME)) / 1000f; + if (time >= 2) START_TIME += 2000; + GLES20.glUniform1f(uTimeHandle, time); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + + GLES20.glUniform1i(uSnowHandle, 5); + GLES20.glActiveTexture(GLES20.GL_TEXTURE5); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, snowTextureId[0]); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + releaseTextureId(); + if (streamObjectBase != null) streamObjectBase.recycle(); + } + + private void releaseTextureId() { + if (snowTextureId != null) GLES20.glDeleteTextures(1, snowTextureId, 0); + snowTextureId = new int[] { -1 }; + } +} \ No newline at end of file diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SwirlFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SwirlFilterRender.java new file mode 100644 index 0000000..39d4117 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/SwirlFilterRender.java @@ -0,0 +1,134 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 29/01/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class SwirlFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uTimeHandle = -1; + private int uResolutionHandle = -1; + private int uRadiusHandle = -1; + private int uCenterHandle = -1; + + private long START_TIME = System.currentTimeMillis(); + private boolean isIncrement = true; + private float time = 0f; + private float radius = 0.2f; + private float centerX = 0.5f, centerY = 0.5f; + + public SwirlFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.swirl_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uTimeHandle = GLES20.glGetUniformLocation(program, "uTime"); + uResolutionHandle = GLES20.glGetUniformLocation(program, "uResolution"); + uRadiusHandle = GLES20.glGetUniformLocation(program, "uRadius"); + uCenterHandle = GLES20.glGetUniformLocation(program, "uCenter"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform1f(uTimeHandle, getTime()); + GLES20.glUniform2f(uResolutionHandle, getWidth(), getHeight()); + GLES20.glUniform2f(uCenterHandle, centerX, centerY); + GLES20.glUniform1f(uRadiusHandle, radius); + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + private float getTime() { + float interval = ((float) (System.currentTimeMillis() - START_TIME)) / 1000f; + START_TIME = System.currentTimeMillis(); + if (isIncrement) { + time += interval; + } else { + time -= interval; + } + if (time > 2) { + isIncrement = false; + } else if (time < -2) { + isIncrement = true; + } + return time; + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getRadius() { + return radius; + } + + public void setRadius(float radius) { + this.radius = radius; + } + + public float[] getCenter() { + return new float[] { centerX, centerY }; + } + + public void setCenterX(float centerX, float centerY) { + this.centerX = centerX; + this.centerY = centerY; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/TemperatureFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/TemperatureFilterRender.java new file mode 100644 index 0000000..c6ae672 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/TemperatureFilterRender.java @@ -0,0 +1,107 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 1/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class TemperatureFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uTemperatureHandle = -1; + + private float temperature = 0.8f; + + public TemperatureFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.temperature_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uTemperatureHandle = GLES20.glGetUniformLocation(program, "uTemperature"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + GLES20.glUniform1f(uTemperatureHandle, temperature); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getTemperature() { + return temperature; + } + + /** + * @param temperature min value 0f, max value 1f + */ + public void setTemperature(float temperature) { + if (temperature < 0.0f) { + this.temperature = 0.0f; + } else if (temperature > 1.0f) { + this.temperature = 1.0f; + } else { + this.temperature = temperature; + } + this.temperature = 2.0f * this.temperature - 1.0f; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ZebraFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ZebraFilterRender.java new file mode 100644 index 0000000..e48bfd0 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/ZebraFilterRender.java @@ -0,0 +1,101 @@ +package com.pedro.encoder.input.gl.render.filters; + +import android.content.Context; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.utils.gl.GlUtil; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * Created by pedro on 4/02/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class ZebraFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uTimeHandle = -1; + private int uLevelsHandle = -1; + + private long START_TIME = System.currentTimeMillis(); + private float levels = 8f; + + public ZebraFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.simple_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.zebra_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uTimeHandle = GLES20.glGetUniformLocation(program, "uTime"); + uLevelsHandle = GLES20.glGetUniformLocation(program, "uLevels"); + } + + @Override + protected void drawFilter() { + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + float time = ((float) (System.currentTimeMillis() - START_TIME)) / 1000.0f; + GLES20.glUniform1f(uTimeHandle, time); + GLES20.glUniform1f(uLevelsHandle, levels); + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + } + + public float getLevels() { + return levels; + } + + public void setLevels(float levels) { + this.levels = levels; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/BaseObjectFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/BaseObjectFilterRender.java new file mode 100644 index 0000000..1b2aa02 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/BaseObjectFilterRender.java @@ -0,0 +1,166 @@ +package com.pedro.encoder.input.gl.render.filters.object; + +import android.content.Context; +import android.graphics.PointF; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.R; +import com.pedro.encoder.input.gl.Sprite; +import com.pedro.encoder.input.gl.TextureLoader; +import com.pedro.encoder.input.gl.render.filters.BaseFilterRender; +import com.pedro.encoder.utils.gl.GlUtil; +import com.pedro.encoder.utils.gl.StreamObjectBase; +import com.pedro.encoder.utils.gl.TranslateTo; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +/** + * Created by pedro on 03/08/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +abstract public class BaseObjectFilterRender extends BaseFilterRender { + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int aTextureObjectHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uObjectHandle = -1; + protected int uAlphaHandle = -1; + + private FloatBuffer squareVertexObject; + + protected int[] streamObjectTextureId = new int[] { -1 }; + protected TextureLoader textureLoader = new TextureLoader(); + protected StreamObjectBase streamObject; + private Sprite sprite; + protected float alpha = 1f; + protected boolean shouldLoad = false; + + public BaseObjectFilterRender() { + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + sprite = new Sprite(); + float[] vertices = sprite.getTransformedVertices(); + squareVertexObject = ByteBuffer.allocateDirect(vertices.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertexObject.put(vertices).position(0); + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.object_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.object_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + aTextureObjectHandle = GLES20.glGetAttribLocation(program, "aTextureObjectCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uObjectHandle = GLES20.glGetUniformLocation(program, "uObject"); + uAlphaHandle = GLES20.glGetUniformLocation(program, "uAlpha"); + } + + @Override + protected void drawFilter() { + if (shouldLoad) { + releaseTexture(); + streamObjectTextureId = textureLoader.load(streamObject.getBitmaps()); + shouldLoad = false; + } + + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + squareVertexObject.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aTextureObjectHandle, 2, GLES20.GL_FLOAT, false, + 2 * FLOAT_SIZE_BYTES, squareVertexObject); + GLES20.glEnableVertexAttribArray(aTextureObjectHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + //Sampler + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + //Object + GLES20.glUniform1i(uObjectHandle, 0); + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + } + + @Override + public void release() { + GLES20.glDeleteProgram(program); + releaseTexture(); + sprite.reset(); + } + + private void releaseTexture() { + GLES20.glDeleteTextures(streamObjectTextureId.length, streamObjectTextureId, 0); + streamObjectTextureId = new int[] { -1 }; + } + + public void setAlpha(float alpha) { + this.alpha = alpha; + } + + public void setScale(float scaleX, float scaleY) { + sprite.scale(scaleX, scaleY); + squareVertexObject.put(sprite.getTransformedVertices()).position(0); + } + + public void setPosition(float x, float y) { + sprite.translate(x, y); + squareVertexObject.put(sprite.getTransformedVertices()).position(0); + } + + public void setPosition(TranslateTo positionTo) { + sprite.translate(positionTo); + squareVertexObject.put(sprite.getTransformedVertices()).position(0); + } + + public PointF getScale() { + return sprite.getScale(); + } + + public PointF getPosition() { + return sprite.getTranslation(); + } + + public void setDefaultScale(int streamWidth, int streamHeight) { + sprite.scale(streamObject.getWidth() * 100 / streamWidth, + streamObject.getHeight() * 100 / streamHeight); + squareVertexObject.put(sprite.getTransformedVertices()).position(0); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/GifObjectFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/GifObjectFilterRender.java new file mode 100644 index 0000000..b6d15d1 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/GifObjectFilterRender.java @@ -0,0 +1,35 @@ +package com.pedro.encoder.input.gl.render.filters.object; + +import android.opengl.GLES20; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.utils.gl.GifStreamObject; +import java.io.IOException; +import java.io.InputStream; + +/** + * Created by pedro on 27/07/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class GifObjectFilterRender extends BaseObjectFilterRender { + + public GifObjectFilterRender() { + super(); + streamObject = new GifStreamObject(); + } + + @Override + protected void drawFilter() { + super.drawFilter(); + int position = ((GifStreamObject) streamObject).updateFrame(streamObjectTextureId.length); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, streamObjectTextureId[position]); + //Set alpha. 0f if no image loaded. + GLES20.glUniform1f(uAlphaHandle, streamObjectTextureId[position] == -1 ? 0f : alpha); + } + + public void setGif(InputStream inputStream) throws IOException { + ((GifStreamObject) streamObject).load(inputStream); + shouldLoad = true; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/ImageObjectFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/ImageObjectFilterRender.java new file mode 100644 index 0000000..b9d89aa --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/ImageObjectFilterRender.java @@ -0,0 +1,33 @@ +package com.pedro.encoder.input.gl.render.filters.object; + +import android.graphics.Bitmap; +import android.opengl.GLES20; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.utils.gl.ImageStreamObject; + +/** + * Created by pedro on 27/07/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class ImageObjectFilterRender extends BaseObjectFilterRender { + + public ImageObjectFilterRender() { + super(); + streamObject = new ImageStreamObject(); + } + + @Override + protected void drawFilter() { + super.drawFilter(); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, streamObjectTextureId[0]); + //Set alpha. 0f if no image loaded. + GLES20.glUniform1f(uAlphaHandle, streamObjectTextureId[0] == -1 ? 0f : alpha); + } + + public void setImage(Bitmap bitmap) { + ((ImageStreamObject) streamObject).load(bitmap); + shouldLoad = true; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/SurfaceFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/SurfaceFilterRender.java new file mode 100644 index 0000000..4ff01ad --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/SurfaceFilterRender.java @@ -0,0 +1,179 @@ +package com.pedro.encoder.input.gl.render.filters.object; + +import android.content.Context; +import android.graphics.PointF; +import android.graphics.SurfaceTexture; +import android.opengl.GLES11Ext; +import android.opengl.GLES20; +import android.opengl.Matrix; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.view.Surface; +import com.pedro.encoder.R; +import com.pedro.encoder.input.gl.Sprite; +import com.pedro.encoder.utils.gl.GlUtil; +import com.pedro.encoder.utils.gl.TranslateTo; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +/** + * Created by pedro on 18/07/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class SurfaceFilterRender extends BaseObjectFilterRender { + + public interface SurfaceReadyCallback { + void surfaceReady(); + } + + //rotation matrix + private final float[] squareVertexDataFilter = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, //bottom left + 1f, -1f, 0f, 1f, 0f, //bottom right + -1f, 1f, 0f, 0f, 1f, //top left + 1f, 1f, 0f, 1f, 1f, //top right + }; + + private int program = -1; + private int aPositionHandle = -1; + private int aTextureHandle = -1; + private int uMVPMatrixHandle = -1; + private int uSTMatrixHandle = -1; + private int uSamplerHandle = -1; + private int uSamplerSurfaceHandle = -1; + private int aTextureObjectHandle = -1; + private int uAlphaHandle = -1; + + private int[] surfaceId = new int[] { -1 }; + private Sprite sprite; + private FloatBuffer squareVertexSurface; + private SurfaceTexture surfaceTexture; + private Surface surface; + private float alpha = 1f; + private SurfaceReadyCallback surfaceReadyCallback; + + public SurfaceFilterRender() { + this(null); + } + + public SurfaceFilterRender(SurfaceReadyCallback surfaceReadyCallback) { + this.surfaceReadyCallback = surfaceReadyCallback; + squareVertex = ByteBuffer.allocateDirect(squareVertexDataFilter.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertex.put(squareVertexDataFilter).position(0); + sprite = new Sprite(); + float[] vertices = sprite.getTransformedVertices(); + squareVertexSurface = ByteBuffer.allocateDirect(vertices.length * FLOAT_SIZE_BYTES) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + squareVertexSurface.put(vertices).position(0); + sprite.getTransformedVertices(); + + Matrix.setIdentityM(MVPMatrix, 0); + Matrix.setIdentityM(STMatrix, 0); + } + + @Override + protected void initGlFilter(Context context) { + String vertexShader = GlUtil.getStringFromRaw(context, R.raw.object_vertex); + String fragmentShader = GlUtil.getStringFromRaw(context, R.raw.surface_fragment); + + program = GlUtil.createProgram(vertexShader, fragmentShader); + aPositionHandle = GLES20.glGetAttribLocation(program, "aPosition"); + aTextureHandle = GLES20.glGetAttribLocation(program, "aTextureCoord"); + aTextureObjectHandle = GLES20.glGetAttribLocation(program, "aTextureObjectCoord"); + uMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); + uSTMatrixHandle = GLES20.glGetUniformLocation(program, "uSTMatrix"); + uSamplerHandle = GLES20.glGetUniformLocation(program, "uSampler"); + uSamplerSurfaceHandle = GLES20.glGetUniformLocation(program, "uSamplerSurface"); + uAlphaHandle = GLES20.glGetUniformLocation(program, "uAlpha"); + + GlUtil.createExternalTextures(1, surfaceId, 0); + surfaceTexture = new SurfaceTexture(surfaceId[0]); + surfaceTexture.setDefaultBufferSize(getWidth(), getHeight()); + surface = new Surface(surfaceTexture); + if (surfaceReadyCallback != null) surfaceReadyCallback.surfaceReady(); + } + + @Override + protected void drawFilter() { + surfaceTexture.updateTexImage(); + + GLES20.glUseProgram(program); + + squareVertex.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aPositionHandle); + + squareVertex.position(SQUARE_VERTEX_DATA_UV_OFFSET); + GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false, + SQUARE_VERTEX_DATA_STRIDE_BYTES, squareVertex); + GLES20.glEnableVertexAttribArray(aTextureHandle); + + squareVertexSurface.position(SQUARE_VERTEX_DATA_POS_OFFSET); + GLES20.glVertexAttribPointer(aTextureObjectHandle, 2, GLES20.GL_FLOAT, false, + 2 * FLOAT_SIZE_BYTES, squareVertexSurface); + GLES20.glEnableVertexAttribArray(aTextureObjectHandle); + + GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, MVPMatrix, 0); + GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, STMatrix, 0); + + GLES20.glUniform1i(uSamplerHandle, 4); + GLES20.glActiveTexture(GLES20.GL_TEXTURE4); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, previousTexId); + //Surface + GLES20.glUniform1i(uSamplerSurfaceHandle, 5); + GLES20.glActiveTexture(GLES20.GL_TEXTURE5); + GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, surfaceId[0]); + //Set alpha. 0f if no image loaded. + GLES20.glUniform1f(uAlphaHandle, surfaceId[0] == -1 ? 0f : alpha); + } + + @Override + public void release() { + if (surfaceId != null) GLES20.glDeleteTextures(1, surfaceId, 0); + surfaceId = new int[] { -1 }; + surfaceTexture.release(); + surface.release(); + } + + public SurfaceTexture getSurfaceTexture() { + return surfaceTexture; + } + + public Surface getSurface() { + return surface; + } + + public void setAlpha(float alpha) { + this.alpha = alpha; + } + + public void setScale(float scaleX, float scaleY) { + sprite.scale(scaleX, scaleY); + squareVertexSurface.put(sprite.getTransformedVertices()).position(0); + } + + public void setPosition(float x, float y) { + sprite.translate(x, y); + squareVertexSurface.put(sprite.getTransformedVertices()).position(0); + } + + public void setPosition(TranslateTo positionTo) { + sprite.translate(positionTo); + squareVertexSurface.put(sprite.getTransformedVertices()).position(0); + } + + public PointF getScale() { + return sprite.getScale(); + } + + public PointF getPosition() { + return sprite.getTranslation(); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/TextObjectFilterRender.java b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/TextObjectFilterRender.java new file mode 100644 index 0000000..30de193 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/gl/render/filters/object/TextObjectFilterRender.java @@ -0,0 +1,37 @@ +package com.pedro.encoder.input.gl.render.filters.object; + +import android.graphics.Typeface; +import android.opengl.GLES20; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.utils.gl.TextStreamObject; + +/** + * Created by pedro on 27/07/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class TextObjectFilterRender extends BaseObjectFilterRender { + + public TextObjectFilterRender() { + super(); + streamObject = new TextStreamObject(); + } + + @Override + protected void drawFilter() { + super.drawFilter(); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, streamObjectTextureId[0]); + //Set alpha. 0f if no image loaded. + GLES20.glUniform1f(uAlphaHandle, streamObjectTextureId[0] == -1 ? 0f : alpha); + } + + public void setText(String text, float textSize, int textColor) { + setText(text, textSize, textColor, null); + } + + public void setText(String text, float textSize, int textColor, Typeface typeface) { + ((TextStreamObject) streamObject).load(text, textSize, textColor, typeface); + shouldLoad = true; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/video/Camera1ApiManager.java b/encoder/src/main/java/com/pedro/encoder/input/video/Camera1ApiManager.java new file mode 100644 index 0000000..03d5118 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/video/Camera1ApiManager.java @@ -0,0 +1,454 @@ +package com.pedro.encoder.input.video; + +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.ImageFormat; +import android.graphics.SurfaceTexture; +import android.hardware.Camera; +import android.media.CamcorderProfile; +import android.util.Log; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.TextureView; + +import com.pedro.encoder.Frame; +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +/** + * Created by pedro on 20/01/17. + * + * This class need use same resolution, fps and imageFormat that VideoEncoder + * Tested with YV12 and NV21. + *

+ * Advantage = you can control fps of the stream. + * Disadvantages = you cant use all resolutions, only resolution that your camera support. + *

+ * If you want use all resolutions. You can use libYuv for resize images in OnPreviewFrame: + * https://chromium.googlesource.com/libyuv/libyuv/ + */ + +public class Camera1ApiManager implements Camera.PreviewCallback, Camera.FaceDetectionListener { + + private String TAG = "Camera1ApiManager"; + private Camera camera = null; + private SurfaceView surfaceView; + private TextureView textureView; + private SurfaceTexture surfaceTexture; + private GetCameraData getCameraData; + private boolean running = false; + private boolean lanternEnable = false; + private int cameraSelect; + private boolean isFrontCamera = false; + private boolean isPortrait = false; + private int cameraFacing = Camera.CameraInfo.CAMERA_FACING_BACK; + private Context context; + + //default parameters for camera + private int width = 640; + private int height = 480; + private int fps = 30; + private int rotation = 0; + private int imageFormat = ImageFormat.NV21; + private byte[] yuvBuffer; + private List previewSizeBack; + private List previewSizeFront; + private float distance; + + //Face detector + public interface FaceDetectorCallback { + void onGetFaces(Camera.Face[] faces); + } + + private FaceDetectorCallback faceDetectorCallback; + + public Camera1ApiManager(SurfaceView surfaceView, GetCameraData getCameraData) { + this.surfaceView = surfaceView; + this.getCameraData = getCameraData; + this.context = surfaceView.getContext(); + init(); + } + + public Camera1ApiManager(TextureView textureView, GetCameraData getCameraData) { + this.textureView = textureView; + this.getCameraData = getCameraData; + this.context = textureView.getContext(); + init(); + } + + public Camera1ApiManager(SurfaceTexture surfaceTexture, Context context) { + this.surfaceTexture = surfaceTexture; + this.context = context; + init(); + } + + private void init() { + cameraSelect = selectCameraBack(); + previewSizeBack = getPreviewSize(); + cameraSelect = selectCameraFront(); + previewSizeFront = getPreviewSize(); + } + + public void setRotation(int rotation) { + this.rotation = rotation; + } + + public void setSurfaceTexture(SurfaceTexture surfaceTexture) { + this.surfaceTexture = surfaceTexture; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public void start(CameraHelper.Facing cameraFacing, int width, int height, int fps) { + int facing = cameraFacing == CameraHelper.Facing.BACK ? Camera.CameraInfo.CAMERA_FACING_BACK + : Camera.CameraInfo.CAMERA_FACING_FRONT; + this.width = width; + this.height = height; + this.fps = fps; + this.cameraFacing = facing; + cameraSelect = + facing == Camera.CameraInfo.CAMERA_FACING_BACK ? selectCameraBack() : selectCameraFront(); + start(); + } + + public void start(int width, int height, int fps) { + CameraHelper.Facing facing = + cameraFacing == Camera.CameraInfo.CAMERA_FACING_BACK ? CameraHelper.Facing.BACK + : CameraHelper.Facing.FRONT; + start(facing, width, height, fps); + } + + private void start() { + if (!checkCanOpen()) { + throw new CameraOpenException("This camera resolution cant be opened"); + } + yuvBuffer = new byte[width * height * 3 / 2]; + try { + camera = Camera.open(cameraSelect); + Camera.CameraInfo info = new Camera.CameraInfo(); + Camera.getCameraInfo(cameraSelect, info); + isFrontCamera = info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT; + isPortrait = context.getResources().getConfiguration().orientation + == Configuration.ORIENTATION_PORTRAIT; + Camera.Parameters parameters = camera.getParameters(); + parameters.setPreviewSize(width, height); + parameters.setPreviewFormat(imageFormat); + int[] range = adaptFpsRange(fps, parameters.getSupportedPreviewFpsRange()); + parameters.setPreviewFpsRange(range[0], range[1]); + + List supportedFocusModes = parameters.getSupportedFocusModes(); + if (supportedFocusModes != null && !supportedFocusModes.isEmpty()) { + if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { + parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); + } else if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { + parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); + } else { + parameters.setFocusMode(supportedFocusModes.get(0)); + } + } + camera.setParameters(parameters); + camera.setDisplayOrientation(rotation); + if (surfaceView != null) { + camera.setPreviewDisplay(surfaceView.getHolder()); + camera.addCallbackBuffer(yuvBuffer); + camera.setPreviewCallbackWithBuffer(this); + } else if (textureView != null) { + camera.setPreviewTexture(textureView.getSurfaceTexture()); + camera.addCallbackBuffer(yuvBuffer); + camera.setPreviewCallbackWithBuffer(this); + } else { + camera.setPreviewTexture(surfaceTexture); + } + camera.startPreview(); + running = true; + Log.i(TAG, width + "X" + height); + } catch (IOException e) { + Log.e(TAG, "Error", e); + } + } + + public void setPreviewOrientation(final int orientation) { + this.rotation = orientation; + if (camera != null && running) { + camera.stopPreview(); + camera.setDisplayOrientation(orientation); + camera.startPreview(); + } + } + + public void setZoom(MotionEvent event) { + try { + if (camera != null && running && camera.getParameters() != null && camera.getParameters() + .isZoomSupported()) { + android.hardware.Camera.Parameters params = camera.getParameters(); + int maxZoom = params.getMaxZoom(); + int zoom = params.getZoom(); + float newDist = CameraHelper.getFingerSpacing(event); + + if (newDist > distance) { + if (zoom < maxZoom) { + zoom++; + } + } else if (newDist < distance) { + if (zoom > 0) { + zoom--; + } + } + + distance = newDist; + params.setZoom(zoom); + camera.setParameters(params); + } + } catch (Exception e) { + Log.e(TAG, "Error", e); + } + } + + private int selectCameraBack() { + return selectCamera(Camera.CameraInfo.CAMERA_FACING_BACK); + } + + private int selectCameraFront() { + return selectCamera(Camera.CameraInfo.CAMERA_FACING_FRONT); + } + + private int selectCamera(int facing) { + int number = Camera.getNumberOfCameras(); + for (int i = 0; i < number; i++) { + Camera.CameraInfo info = new Camera.CameraInfo(); + Camera.getCameraInfo(i, info); + if (info.facing == facing) return i; + } + return 0; + } + + public void stop() { + if (camera != null) { + camera.stopPreview(); + camera.setPreviewCallback(null); + camera.setPreviewCallbackWithBuffer(null); + camera.release(); + camera = null; + } + running = false; + } + + public boolean isRunning() { + return running; + } + + private int[] adaptFpsRange(int expectedFps, List fpsRanges) { + expectedFps *= 1000; + int[] closestRange = fpsRanges.get(0); + int measure = Math.abs(closestRange[0] - expectedFps) + Math.abs(closestRange[1] - expectedFps); + for (int[] range : fpsRanges) { + if (range[0] <= expectedFps && range[1] >= expectedFps) { + int curMeasure = Math.abs(range[0] - expectedFps) + Math.abs(range[1] - expectedFps); + if (curMeasure < measure) { + closestRange = range; + measure = curMeasure; + } + } + } + return closestRange; + } + + @Override + public void onPreviewFrame(byte[] data, Camera camera) { + getCameraData.inputYUVData(new Frame(data, rotation, isFrontCamera && isPortrait, imageFormat)); + camera.addCallbackBuffer(yuvBuffer); + } + + /** + * See: https://developer.android.com/reference/android/graphics/ImageFormat.html to know name of + * constant values + * Example: 842094169 -> YV12, 17 -> NV21 + */ + public List getCameraPreviewImageFormatSupported() { + List formats; + if (camera != null) { + formats = camera.getParameters().getSupportedPreviewFormats(); + for (Integer i : formats) { + Log.i(TAG, "camera format supported: " + i); + } + } else { + camera = Camera.open(cameraSelect); + formats = camera.getParameters().getSupportedPreviewFormats(); + camera.release(); + camera = null; + } + return formats; + } + + private List getPreviewSize() { + List previewSizes; + Camera.Size maxSize; + if (camera != null) { + maxSize = getMaxEncoderSizeSupported(); + previewSizes = camera.getParameters().getSupportedPreviewSizes(); + } else { + camera = Camera.open(cameraSelect); + maxSize = getMaxEncoderSizeSupported(); + previewSizes = camera.getParameters().getSupportedPreviewSizes(); + camera.release(); + camera = null; + } + //discard preview more high than device can record + Iterator iterator = previewSizes.iterator(); + while (iterator.hasNext()) { + Camera.Size size = iterator.next(); + if (size.width > maxSize.width || size.height > maxSize.height) { + Log.i(TAG, size.width + "X" + size.height + ", not supported for encoder"); + iterator.remove(); + } + } + return previewSizes; + } + + public List getPreviewSizeBack() { + return previewSizeBack; + } + + public List getPreviewSizeFront() { + return previewSizeFront; + } + + /** + * @return max size that device can record. + */ + private Camera.Size getMaxEncoderSizeSupported() { + if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_2160P)) { + return camera.new Size(3840, 2160); + } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P)) { + return camera.new Size(1920, 1080); + } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)) { + return camera.new Size(1280, 720); + } else { + return camera.new Size(640, 480); + } + } + + public boolean isFrontCamera() { + return isFrontCamera; + } + + public void switchCamera() throws CameraOpenException { + if (camera != null) { + int oldCamera = cameraSelect; + int number = Camera.getNumberOfCameras(); + for (int i = 0; i < number; i++) { + if (cameraSelect != i) { + cameraSelect = i; + if (!checkCanOpen()) { + cameraSelect = oldCamera; + throw new CameraOpenException("This camera resolution cant be opened"); + } + stop(); + cameraFacing = cameraFacing == Camera.CameraInfo.CAMERA_FACING_BACK + ? Camera.CameraInfo.CAMERA_FACING_FRONT : Camera.CameraInfo.CAMERA_FACING_BACK; + start(); + return; + } + } + } + } + + private boolean checkCanOpen() { + List previews; + if (cameraSelect == selectCameraBack()) { + previews = previewSizeBack; + } else { + previews = previewSizeFront; + } + for (Camera.Size size : previews) { + if (size.width == width && size.height == height) { + return true; + } + } + return false; + } + + public boolean isLanternEnabled() { + return lanternEnable; + } + + /** + * @required: + */ + public void enableLantern() throws Exception { + if (camera != null) { + Camera.Parameters parameters = camera.getParameters(); + List supportedFlashModes = parameters.getSupportedFlashModes(); + if (supportedFlashModes != null && !supportedFlashModes.isEmpty()) { + if (supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) { + parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); + camera.setParameters(parameters); + lanternEnable = true; + } else { + Log.e(TAG, "Lantern unsupported"); + throw new Exception("Lantern unsupported"); + } + } + } + } + + /** + * @required: + */ + public void disableLantern() { + if (camera != null) { + Camera.Parameters parameters = camera.getParameters(); + parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); + camera.setParameters(parameters); + lanternEnable = false; + } + } + + public void enableRecordingHint() { + if (camera != null) { + Camera.Parameters parameters = camera.getParameters(); + parameters.setRecordingHint(true); + camera.setParameters(parameters); + } + } + + public void disableRecordingHint() { + if (camera != null) { + Camera.Parameters parameters = camera.getParameters(); + parameters.setRecordingHint(false); + camera.setParameters(parameters); + } + } + + public void enableFaceDetection(FaceDetectorCallback faceDetectorCallback) { + if (camera != null) { + this.faceDetectorCallback = faceDetectorCallback; + camera.setFaceDetectionListener(this); + camera.startFaceDetection(); + } + } + + public void disableFaceDetection() { + if (camera != null) { + faceDetectorCallback = null; + camera.stopFaceDetection(); + camera.setFaceDetectionListener(null); + } + } + + public boolean isFaceDetectionEnabled() { + return faceDetectorCallback != null; + } + + @Override + public void onFaceDetection(Camera.Face[] faces, Camera camera) { + if (faceDetectorCallback != null) faceDetectorCallback.onGetFaces(faces); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.java b/encoder/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.java new file mode 100644 index 0000000..cf15f4b --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.java @@ -0,0 +1,539 @@ +package com.pedro.encoder.input.video; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Rect; +import android.graphics.SurfaceTexture; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCaptureSession; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.CaptureResult; +import android.hardware.camera2.TotalCaptureResult; +import android.hardware.camera2.params.Face; +import android.hardware.camera2.params.StreamConfigurationMap; +import android.os.Build; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.util.Size; +import android.view.MotionEvent; +import android.view.Surface; +import android.view.SurfaceView; +import android.view.TextureView; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static android.hardware.camera2.CameraMetadata.LENS_FACING_FRONT; + +/** + * Created by pedro on 4/03/17. + * + *

+ * Class for use surfaceEncoder to buffer encoder. + * Advantage = you can use all resolutions. + * Disadvantages = you cant control fps of the stream, because you cant know when the inputSurface + * was renderer. + *

+ * Note: you can use opengl for surfaceEncoder to buffer encoder on devices 21 < API > 16: + * https://github.com/google/grafika + */ + +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +public class Camera2ApiManager extends CameraDevice.StateCallback { + + private final String TAG = "Camera2ApiManager"; + + private CameraDevice cameraDevice; + private SurfaceView surfaceView; + private TextureView textureView; + private Surface surfaceEncoder; //input surfaceEncoder from videoEncoder + private CameraManager cameraManager; + private Handler cameraHandler; + private CameraCaptureSession cameraCaptureSession; + private boolean prepared = false; + private int cameraId = -1; + private boolean isFrontCamera = false; + private CameraCharacteristics cameraCharacteristics; + private CaptureRequest.Builder builderInputSurface; + private float fingerSpacing = 0; + private float zoomLevel = 1.0f; + private boolean lanternEnable = false; + private boolean running = false; + + //Face detector + public interface FaceDetectorCallback { + void onGetFaces(Face[] faces); + } + + private FaceDetectorCallback faceDetectorCallback; + private boolean faceDetectionEnabled = false; + private int faceDetectionMode; + + public Camera2ApiManager(Context context) { + cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); + } + + public void prepareCamera(SurfaceView surfaceView, Surface surface) { + this.surfaceView = surfaceView; + this.surfaceEncoder = surface; + prepared = true; + } + + public void prepareCamera(TextureView textureView, Surface surface) { + this.textureView = textureView; + this.surfaceEncoder = surface; + prepared = true; + } + + public void prepareCamera(Surface surface) { + this.surfaceEncoder = surface; + prepared = true; + } + + public void prepareCamera(SurfaceTexture surfaceTexture, int width, int height) { + surfaceTexture.setDefaultBufferSize(width, height); + this.surfaceEncoder = new Surface(surfaceTexture); + prepared = true; + } + + public boolean isPrepared() { + return prepared; + } + + private void startPreview(CameraDevice cameraDevice) { + try { + final List listSurfaces = new ArrayList<>(); + Surface preview = addPreviewSurface(); + if (preview != null) listSurfaces.add(preview); + if (surfaceEncoder != null) listSurfaces.add(surfaceEncoder); + + cameraDevice.createCaptureSession(listSurfaces, new CameraCaptureSession.StateCallback() { + @Override + public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { + Camera2ApiManager.this.cameraCaptureSession = cameraCaptureSession; + try { + CaptureRequest captureRequest = drawSurface(listSurfaces); + if (captureRequest != null) { + cameraCaptureSession.setRepeatingRequest(captureRequest, + faceDetectionEnabled ? cb : null, cameraHandler); + Log.i(TAG, "Camera configured"); + } else { + Log.e(TAG, "Error, captureRequest is null"); + } + } catch (CameraAccessException | NullPointerException e) { + Log.e(TAG, "Error", e); + } catch (IllegalStateException e) { + reOpenCamera(cameraId != -1 ? cameraId : 0); + } + } + + @Override + public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { + cameraCaptureSession.close(); + Log.e(TAG, "Configuration failed"); + } + }, null); + } catch (CameraAccessException e) { + Log.e(TAG, "Error", e); + } catch (IllegalStateException e) { + reOpenCamera(cameraId != -1 ? cameraId : 0); + } + } + + private Surface addPreviewSurface() { + Surface surface = null; + if (surfaceView != null) { + surface = surfaceView.getHolder().getSurface(); + } else if (textureView != null) { + final SurfaceTexture texture = textureView.getSurfaceTexture(); + surface = new Surface(texture); + } + return surface; + } + + private CaptureRequest drawSurface(List surfaces) { + try { + builderInputSurface = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); + for (Surface surface : surfaces) if (surface != null) builderInputSurface.addTarget(surface); + return builderInputSurface.build(); + } catch (CameraAccessException | IllegalStateException e) { + Log.e(TAG, "Error", e); + return null; + } + } + + public int getLevelSupported() { + try { + cameraCharacteristics = cameraManager.getCameraCharacteristics("0"); + return cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL); + } catch (CameraAccessException | IllegalStateException e) { + Log.e(TAG, "Error", e); + return -1; + } + } + + public void openCamera() { + openCameraBack(); + } + + public void openCameraBack() { + openCameraFacing(CameraHelper.Facing.BACK); + } + + public void openCameraFront() { + openCameraFacing(CameraHelper.Facing.FRONT); + } + + public void openLastCamera() { + if (cameraId == -1) { + openCameraBack(); + } else { + openCameraId(cameraId); + } + } + + public Size[] getCameraResolutionsBack() { + try { + cameraCharacteristics = cameraManager.getCameraCharacteristics("0"); + if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) + != CameraCharacteristics.LENS_FACING_BACK) { + cameraCharacteristics = cameraManager.getCameraCharacteristics("1"); + } + StreamConfigurationMap streamConfigurationMap = + cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); + return streamConfigurationMap.getOutputSizes(SurfaceTexture.class); + } catch (CameraAccessException e) { + Log.e(TAG, "Error", e); + return new Size[0]; + } + } + + public Size[] getCameraResolutionsFront() { + try { + cameraCharacteristics = cameraManager.getCameraCharacteristics("0"); + if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) + != CameraCharacteristics.LENS_FACING_FRONT) { + cameraCharacteristics = cameraManager.getCameraCharacteristics("1"); + } + StreamConfigurationMap streamConfigurationMap = + cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); + return streamConfigurationMap.getOutputSizes(SurfaceTexture.class); + } catch (CameraAccessException e) { + Log.e(TAG, "Error", e); + return new Size[0]; + } + } + + public CameraCharacteristics getCameraCharacteristics() { + return cameraCharacteristics; + } + + /** + * Select camera facing + * + * @param cameraFacing - CameraCharacteristics.LENS_FACING_FRONT, CameraCharacteristics.LENS_FACING_BACK, + * CameraCharacteristics.LENS_FACING_EXTERNAL + */ + public void openCameraFacing(CameraHelper.Facing cameraFacing) { + int facing = cameraFacing == CameraHelper.Facing.BACK ? CameraMetadata.LENS_FACING_BACK + : CameraMetadata.LENS_FACING_FRONT; + try { + cameraCharacteristics = cameraManager.getCameraCharacteristics("0"); + if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == facing) { + openCameraId(0); + } else { + openCameraId(cameraManager.getCameraIdList().length - 1); + } + } catch (CameraAccessException e) { + Log.e(TAG, "Error", e); + } + } + + public boolean isLanternSupported() { + return (cameraCharacteristics != null ? cameraCharacteristics.get( + CameraCharacteristics.FLASH_INFO_AVAILABLE) : false); + } + + public boolean isLanternEnabled() { + return lanternEnable; + } + + /** + * @required: + */ + public void enableLantern() throws Exception { + if ((cameraCharacteristics != null) && cameraCharacteristics.get( + CameraCharacteristics.FLASH_INFO_AVAILABLE)) { + if (builderInputSurface != null) { + try { + builderInputSurface.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH); + cameraCaptureSession.setRepeatingRequest(builderInputSurface.build(), + faceDetectionEnabled ? cb : null, null); + lanternEnable = true; + } catch (Exception e) { + Log.e(TAG, "Error", e); + } + } + } else { + Log.e(TAG, "Lantern unsupported"); + throw new Exception("Lantern unsupported"); + } + } + + /** + * @required: + */ + public void disableLantern() { + if ((cameraCharacteristics != null) && cameraCharacteristics.get( + CameraCharacteristics.FLASH_INFO_AVAILABLE)) { + if (builderInputSurface != null) { + try { + builderInputSurface.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF); + cameraCaptureSession.setRepeatingRequest(builderInputSurface.build(), + faceDetectionEnabled ? cb : null, null); + lanternEnable = false; + } catch (Exception e) { + Log.e(TAG, "Error", e); + } + } + } + } + + public void enableFaceDetection(FaceDetectorCallback faceDetectorCallback) { + int[] fd = cameraCharacteristics.get( + CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES); + int maxFD = cameraCharacteristics.get(CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT); + if (fd.length > 0) { + List fdList = new ArrayList<>(); + for (int FaceD : fd) { + fdList.add(FaceD); + } + if (maxFD > 0) { + this.faceDetectorCallback = faceDetectorCallback; + faceDetectionEnabled = true; + faceDetectionMode = Collections.max(fdList); + setFaceDetect(builderInputSurface, faceDetectionMode); + prepareFaceDetectionCallback(); + } else { + Log.e(TAG, "No face detection"); + } + } else { + Log.e(TAG, "No face detection"); + } + } + + public void disableFaceDetection() { + if (faceDetectionEnabled) { + faceDetectorCallback = null; + faceDetectionEnabled = false; + faceDetectionMode = 0; + prepareFaceDetectionCallback(); + } + } + + public boolean isFaceDetectionEnabled() { + return faceDetectorCallback != null; + } + + private void setFaceDetect(CaptureRequest.Builder requestBuilder, int faceDetectMode) { + if (faceDetectionEnabled) { + requestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, faceDetectMode); + } + } + + private void prepareFaceDetectionCallback() { + try { + cameraCaptureSession.stopRepeating(); + cameraCaptureSession.setRepeatingRequest(builderInputSurface.build(), + faceDetectionEnabled ? cb : null, null); + } catch (CameraAccessException e) { + Log.e(TAG, "Error", e); + } + } + + private final CameraCaptureSession.CaptureCallback cb = + new CameraCaptureSession.CaptureCallback() { + + @Override + public void onCaptureCompleted(@NonNull CameraCaptureSession session, + @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { + Face[] faces = result.get(CaptureResult.STATISTICS_FACES); + if (faceDetectorCallback != null) { + faceDetectorCallback.onGetFaces(faces); + } + } + }; + + @SuppressLint("MissingPermission") + public void openCameraId(Integer cameraId) { + this.cameraId = cameraId; + if (prepared) { + HandlerThread cameraHandlerThread = new HandlerThread(TAG + " Id = " + cameraId); + cameraHandlerThread.start(); + cameraHandler = new Handler(cameraHandlerThread.getLooper()); + try { + cameraManager.openCamera(cameraId.toString(), this, cameraHandler); + cameraCharacteristics = cameraManager.getCameraCharacteristics(Integer.toString(cameraId)); + running = true; + isFrontCamera = + (LENS_FACING_FRONT == cameraCharacteristics.get(CameraCharacteristics.LENS_FACING)); + } catch (CameraAccessException | SecurityException e) { + Log.e(TAG, "Error", e); + } + } else { + Log.e(TAG, "Camera2ApiManager need be prepared, Camera2ApiManager not enabled"); + } + } + + public boolean isRunning() { + return running; + } + + public void switchCamera() { + int cameraId = cameraDevice == null ? 0 : Integer.parseInt(cameraDevice.getId()) == 1 ? 0 : 1; + reOpenCamera(cameraId); + } + + private void reOpenCamera(int cameraId) { + if (cameraDevice != null) { + closeCamera(false); + if (textureView != null) { + prepareCamera(textureView, surfaceEncoder); + } else if (surfaceView != null) { + prepareCamera(surfaceView, surfaceEncoder); + } else { + prepareCamera(surfaceEncoder); + } + openCameraId(cameraId); + } + } + + public float getMaxZoom() { + return (cameraCharacteristics != null ? cameraCharacteristics.get( + CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM) : 1); + } + + public Float getZoom() { + return zoomLevel; + } + + public void setZoom(Float level) { + try { + float maxZoom = getMaxZoom(); + Rect m = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); + + if ((level <= maxZoom) && (level >= 1)) { + zoomLevel = level; + int minW = (int) (m.width() / (maxZoom * 10)); + int minH = (int) (m.height() / (maxZoom * 10)); + int difW = m.width() - minW; + int difH = m.height() - minH; + int cropW = (int) (difW / 10 * level); + int cropH = (int) (difH / 10 * level); + cropW -= cropW & 3; + cropH -= cropH & 3; + Rect zoom = new Rect(cropW, cropH, m.width() - cropW, m.height() - cropH); + builderInputSurface.set(CaptureRequest.SCALER_CROP_REGION, zoom); + cameraCaptureSession.setRepeatingRequest(builderInputSurface.build(), + faceDetectionEnabled ? cb : null, null); + } + } catch (CameraAccessException e) { + Log.e(TAG, "Error", e); + } + } + + public void setZoom(MotionEvent event) { + float currentFingerSpacing; + + if (event.getPointerCount() > 1) { + // Multi touch logic + currentFingerSpacing = CameraHelper.getFingerSpacing(event); + if (fingerSpacing != 0) { + if (currentFingerSpacing > fingerSpacing && getMaxZoom() > zoomLevel) { + zoomLevel += 0.1f; + } else if (currentFingerSpacing < fingerSpacing && zoomLevel > 1) { + zoomLevel -= 0.1f; + } + setZoom(zoomLevel); + } + fingerSpacing = currentFingerSpacing; + } + } + + public boolean isFrontCamera() { + return isFrontCamera; + } + + private void resetCameraValues() { + lanternEnable = false; + zoomLevel = 1.0f; + } + + public void stopRepeatingEncoder() { + if (cameraCaptureSession != null) { + try { + cameraCaptureSession.stopRepeating(); + surfaceEncoder = null; + CaptureRequest captureRequest = drawSurface(Collections.singletonList(addPreviewSurface())); + if (captureRequest != null) { + cameraCaptureSession.setRepeatingRequest(captureRequest, null, cameraHandler); + } + } catch (CameraAccessException e) { + Log.e(TAG, "Error", e); + } + } + } + + public void closeCamera() { + closeCamera(true); + } + + public void closeCamera(boolean resetSurface) { + resetCameraValues(); + cameraCharacteristics = null; + if (cameraCaptureSession != null) { + cameraCaptureSession.close(); + cameraCaptureSession = null; + } + if (cameraDevice != null) { + cameraDevice.close(); + cameraDevice = null; + } + if (cameraHandler != null) { + cameraHandler.getLooper().quitSafely(); + cameraHandler = null; + } + if (resetSurface) { + surfaceEncoder = null; + builderInputSurface = null; + } + prepared = false; + running = false; + } + + @Override + public void onOpened(@NonNull CameraDevice cameraDevice) { + this.cameraDevice = cameraDevice; + startPreview(cameraDevice); + Log.i(TAG, "Camera opened"); + } + + @Override + public void onDisconnected(@NonNull CameraDevice cameraDevice) { + cameraDevice.close(); + Log.i(TAG, "Camera disconnected"); + } + + @Override + public void onError(@NonNull CameraDevice cameraDevice, int i) { + cameraDevice.close(); + Log.e(TAG, "Open failed"); + } +} \ No newline at end of file diff --git a/encoder/src/main/java/com/pedro/encoder/input/video/CameraHelper.java b/encoder/src/main/java/com/pedro/encoder/input/video/CameraHelper.java new file mode 100644 index 0000000..550c511 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/video/CameraHelper.java @@ -0,0 +1,60 @@ +package com.pedro.encoder.input.video; + +import android.content.Context; +import android.view.MotionEvent; +import android.view.Surface; +import android.view.WindowManager; + +/** + * Created by pedro on 17/12/18. + */ +public class CameraHelper { + + private static final float[] verticesData = { + // X, Y, Z, U, V + -1f, -1f, 0f, 0f, 0f, + 1f, -1f, 0f, 1f, 0f, + -1f, 1f, 0f, 0f, 1f, + 1f, 1f, 0f, 1f, 1f, + }; + + public static float[] getVerticesData() { + return verticesData; + } + + public static int getCameraOrientation(Context context) { + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + if (windowManager != null) { + int orientation = windowManager.getDefaultDisplay().getRotation(); + switch (orientation) { + case Surface.ROTATION_0: //portrait + return 90; + case Surface.ROTATION_90: //landscape + return 0; + case Surface.ROTATION_180: //reverse portrait + return 270; + case Surface.ROTATION_270: //reverse landscape + return 180; + default: + return 0; + } + } else { + return 0; + } + } + + public static boolean isPortrait(Context context) { + int orientation = getCameraOrientation(context); + return orientation == 90 || orientation == 270; + } + + public static float getFingerSpacing(MotionEvent event) { + float x = event.getX(0) - event.getX(1); + float y = event.getY(0) - event.getY(1); + return (float) Math.sqrt(x * x + y * y); + } + + public enum Facing { + BACK, FRONT + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/video/CameraOpenException.java b/encoder/src/main/java/com/pedro/encoder/input/video/CameraOpenException.java new file mode 100644 index 0000000..4283124 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/video/CameraOpenException.java @@ -0,0 +1,12 @@ +package com.pedro.encoder.input.video; + +/** + * Created by pedro on 12/04/17. + */ + +public class CameraOpenException extends RuntimeException { + + public CameraOpenException(String message) { + super(message); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/video/FaceDetectorUtil.java b/encoder/src/main/java/com/pedro/encoder/input/video/FaceDetectorUtil.java new file mode 100644 index 0000000..7e6a4e5 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/video/FaceDetectorUtil.java @@ -0,0 +1,82 @@ +package com.pedro.encoder.input.video; + +import android.graphics.Matrix; +import android.graphics.PointF; +import android.graphics.RectF; +import android.hardware.Camera; +import android.hardware.camera2.params.Face; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.view.View; + +/** + * Created by pedro on 17/10/18. + */ + +public class FaceDetectorUtil { + + public class FaceParsed { + private PointF position; + private PointF scale; + + public FaceParsed(PointF position, PointF scale) { + this.position = position; + this.scale = scale; + } + + public PointF getPosition() { + return position; + } + + public void setPosition(PointF position) { + this.position = position; + } + + public PointF getScale() { + return scale; + } + + public void setScale(PointF scale) { + this.scale = scale; + } + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + public FaceParsed camera2Parse(Face face, View view, PointF scale, int rotation, + boolean isFrontCamera) { + //Parse face + RectF rect = new RectF(face.getBounds()); + Matrix matrix = new Matrix(); + matrix.setScale(isFrontCamera ? -1 : 1, 1); + matrix.postRotate(rotation); + matrix.postScale(1f, 1f); + matrix.postTranslate(view.getWidth(), view.getHeight()); + matrix.mapRect(rect); + return getFace(rect, scale, view); + } + + public FaceParsed camera1Parse(Camera.Face face, View view, PointF scale, int rotation, + boolean isFrontCamera) { + //Parse face + RectF rect = new RectF(face.rect); + Matrix matrix = new Matrix(); + matrix.setScale(isFrontCamera ? -1 : 1, 1); + matrix.postRotate(rotation); + matrix.postScale(view.getWidth() / 2000f, view.getHeight() / 2000f); + matrix.postTranslate(view.getWidth() / 2f, view.getHeight() / 2f); + matrix.mapRect(rect); + return getFace(rect, scale, view); + } + + private FaceParsed getFace(RectF rectF, PointF scale, View view) { + //Position + float posX = rectF.centerX() * 100 / view.getWidth(); + float posY = rectF.centerY() * 100 / view.getHeight(); + PointF positionParsed = new PointF(posX - scale.x / 2, posY - scale.y / 2); + //Scale + float scaleX = rectF.width() * 100 / view.getWidth(); + float scaleY = rectF.height() * 100 / view.getHeight(); + PointF scaleParsed = new PointF(scaleX, scaleY); + return new FaceParsed(positionParsed, scaleParsed); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/video/FpsLimiter.java b/encoder/src/main/java/com/pedro/encoder/input/video/FpsLimiter.java new file mode 100644 index 0000000..df99edb --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/video/FpsLimiter.java @@ -0,0 +1,27 @@ +package com.pedro.encoder.input.video; + +/** + * Created by pedro on 11/10/18. + */ + +public class FpsLimiter { + + private long startTS = System.currentTimeMillis(); + private long ratioF = 1000 / 30; + private long ratio = 1000 / 30; + + public void setFPS(int fps) { + startTS = System.currentTimeMillis(); + ratioF = 1000 / fps; + ratio = 1000 / fps; + } + + public boolean limitFPS() { + long lastFrameTimestamp = System.currentTimeMillis() - startTS; + if (ratio < lastFrameTimestamp) { + ratio += ratioF; + return false; + } + return true; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/input/video/GetCameraData.java b/encoder/src/main/java/com/pedro/encoder/input/video/GetCameraData.java new file mode 100644 index 0000000..6c4f666 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/input/video/GetCameraData.java @@ -0,0 +1,12 @@ +package com.pedro.encoder.input.video; + +import com.pedro.encoder.Frame; + +/** + * Created by pedro on 20/01/17. + */ + +public interface GetCameraData { + + void inputYUVData(Frame frame); +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/CodecUtil.java b/encoder/src/main/java/com/pedro/encoder/utils/CodecUtil.java new file mode 100644 index 0000000..78fce54 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/CodecUtil.java @@ -0,0 +1,296 @@ +package com.pedro.encoder.utils; + +import android.media.MediaCodecInfo; +import android.media.MediaCodecList; +import android.os.Build; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Created by pedro on 14/02/18. + */ + +public class CodecUtil { + + private static final String TAG = "CodecUtil"; + + public static final String H264_MIME = "video/avc"; + public static final String H265_MIME = "video/hevc"; + public static final String AAC_MIME = "audio/mp4a-latm"; + + public enum Force { + FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE + } + + public static List showAllCodecsInfo() { + List mediaCodecInfoList = getAllCodecs(false); + List infos = new ArrayList<>(); + for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) { + String info = "----------------\n"; + info += "Name: " + mediaCodecInfo.getName() + "\n"; + for (String type : mediaCodecInfo.getSupportedTypes()) { + info += "Type: " + type + "\n"; + MediaCodecInfo.CodecCapabilities codecCapabilities = + mediaCodecInfo.getCapabilitiesForType(type); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + info += "Max instances: " + codecCapabilities.getMaxSupportedInstances() + "\n"; + } + if (mediaCodecInfo.isEncoder()) { + info += "----- Encoder info -----\n"; + MediaCodecInfo.EncoderCapabilities encoderCapabilities = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + encoderCapabilities = codecCapabilities.getEncoderCapabilities(); + info += "Complexity range: " + + encoderCapabilities.getComplexityRange().getLower() + + " - " + + encoderCapabilities.getComplexityRange().getUpper() + + "\n"; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + info += "Quality range: " + + encoderCapabilities.getQualityRange().getLower() + + " - " + + encoderCapabilities.getQualityRange().getUpper() + + "\n"; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + info += "CBR supported: " + encoderCapabilities.isBitrateModeSupported( + MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR) + "\n"; + info += "VBR supported: " + encoderCapabilities.isBitrateModeSupported( + MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_VBR) + "\n"; + info += "CQ supported: " + encoderCapabilities.isBitrateModeSupported( + MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CQ) + "\n"; + } + info += "----- -----\n"; + } else { + info += "----- Decoder info -----\n"; + info += "----- -----\n"; + } + + if (codecCapabilities.colorFormats != null && codecCapabilities.colorFormats.length > 0) { + info += "----- Video info -----\n"; + info += "Supported colors: \n"; + for (int color : codecCapabilities.colorFormats) info += color + "\n"; + for (MediaCodecInfo.CodecProfileLevel profile : codecCapabilities.profileLevels) + info += "Profile: " + profile.profile + ", level: " + profile.level + "\n"; + MediaCodecInfo.VideoCapabilities videoCapabilities = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + videoCapabilities = codecCapabilities.getVideoCapabilities(); + + info += "Bitrate range: " + + videoCapabilities.getBitrateRange().getLower() + + " - " + + videoCapabilities.getBitrateRange().getUpper() + + "\n"; + info += "Frame rate range: " + + videoCapabilities.getSupportedFrameRates().getLower() + + " - " + + videoCapabilities.getSupportedFrameRates().getUpper() + + "\n"; + info += "Width range: " + + videoCapabilities.getSupportedWidths().getLower() + + " - " + + videoCapabilities.getSupportedWidths().getUpper() + + "\n"; + info += "Height range: " + + videoCapabilities.getSupportedHeights().getLower() + + " - " + + videoCapabilities.getSupportedHeights().getUpper() + + "\n"; + } + info += "----- -----\n"; + } else { + info += "----- Audio info -----\n"; + for (MediaCodecInfo.CodecProfileLevel profile : codecCapabilities.profileLevels) + info += "Profile: " + profile.profile + ", level: " + profile.level + "\n"; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + MediaCodecInfo.AudioCapabilities audioCapabilities = + codecCapabilities.getAudioCapabilities(); + + info += "Bitrate range: " + + audioCapabilities.getBitrateRange().getLower() + + " - " + + audioCapabilities.getBitrateRange().getUpper() + + "\n"; + info += "Channels supported: " + audioCapabilities.getMaxInputChannelCount() + "\n"; + try { + if (audioCapabilities.getSupportedSampleRates() != null + && audioCapabilities.getSupportedSampleRates().length > 0) { + info += "Supported sample rate: \n"; + for (int sr : audioCapabilities.getSupportedSampleRates()) info += sr + "\n"; + } + } catch (Exception e) { + } + } + info += "----- -----\n"; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + info += "Max instances: " + codecCapabilities.getMaxSupportedInstances() + "\n"; + } + } + info += "----------------\n"; + infos.add(info); + } + return infos; + } + + public static List getAllCodecs(boolean filterBroken) { + List mediaCodecInfoList = new ArrayList<>(); + if (Build.VERSION.SDK_INT >= 21) { + MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS); + MediaCodecInfo[] mediaCodecInfos = mediaCodecList.getCodecInfos(); + mediaCodecInfoList.addAll(Arrays.asList(mediaCodecInfos)); + } else { + int count = MediaCodecList.getCodecCount(); + for (int i = 0; i < count; i++) { + MediaCodecInfo mci = MediaCodecList.getCodecInfoAt(i); + mediaCodecInfoList.add(mci); + } + } + return filterBroken ? filterBrokenCodecs(mediaCodecInfoList) : mediaCodecInfoList; + } + + public static List getAllHardwareEncoders(String mime) { + List mediaCodecInfoList = getAllEncoders(mime); + List mediaCodecInfoHardware = new ArrayList<>(); + for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) { + if (isHardwareAccelerated(mediaCodecInfo)) { + mediaCodecInfoHardware.add(mediaCodecInfo); + } + } + return mediaCodecInfoHardware; + } + + public static List getAllHardwareDecoders(String mime) { + List mediaCodecInfoList = getAllDecoders(mime); + List mediaCodecInfoHardware = new ArrayList<>(); + for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) { + if (isHardwareAccelerated(mediaCodecInfo)) { + mediaCodecInfoHardware.add(mediaCodecInfo); + } + } + return mediaCodecInfoHardware; + } + + public static List getAllSoftwareEncoders(String mime) { + List mediaCodecInfoList = getAllEncoders(mime); + List mediaCodecInfoSoftware = new ArrayList<>(); + for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) { + if (isSoftwareOnly(mediaCodecInfo)) { + mediaCodecInfoSoftware.add(mediaCodecInfo); + } + } + return mediaCodecInfoSoftware; + } + + public static List getAllSoftwareDecoders(String mime) { + List mediaCodecInfoList = getAllDecoders(mime); + List mediaCodecInfoSoftware = new ArrayList<>(); + for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) { + if (isSoftwareOnly(mediaCodecInfo)) { + mediaCodecInfoSoftware.add(mediaCodecInfo); + } + } + return mediaCodecInfoSoftware; + } + + /** + * choose the video encoder by mime. + */ + public static List getAllEncoders(String mime) { + List mediaCodecInfoList = new ArrayList<>(); + List mediaCodecInfos = getAllCodecs(true); + for (MediaCodecInfo mci : mediaCodecInfos) { + if (!mci.isEncoder()) { + continue; + } + String[] types = mci.getSupportedTypes(); + for (String type : types) { + if (type.equalsIgnoreCase(mime)) { + mediaCodecInfoList.add(mci); + } + } + } + return mediaCodecInfoList; + } + + /** + * choose the video encoder by mime. + */ + public static List getAllDecoders(String mime) { + List mediaCodecInfoList = new ArrayList<>(); + List mediaCodecInfos = getAllCodecs(true); + for (MediaCodecInfo mci : mediaCodecInfos) { + if (mci.isEncoder()) { + continue; + } + String[] types = mci.getSupportedTypes(); + for (String type : types) { + if (type.equalsIgnoreCase(mime)) { + mediaCodecInfoList.add(mci); + } + } + } + return mediaCodecInfoList; + } + + /* Adapted from google/ExoPlayer + * https://github.com/google/ExoPlayer/commit/48555550d7fcf6953f2382466818c74092b26355 + */ + private static boolean isHardwareAccelerated(MediaCodecInfo codecInfo) { + if (Build.VERSION.SDK_INT >= 29) { + return codecInfo.isHardwareAccelerated(); + } + // codecInfo.isHardwareAccelerated() != codecInfo.isSoftwareOnly() is not necessarily true. + // However, we assume this to be true as an approximation. + return !isSoftwareOnly(codecInfo); + } + + /* Adapted from google/ExoPlayer + * https://github.com/google/ExoPlayer/commit/48555550d7fcf6953f2382466818c74092b26355 + */ + private static boolean isSoftwareOnly(MediaCodecInfo mediaCodecInfo) { + if (Build.VERSION.SDK_INT >= 29) { + return mediaCodecInfo.isSoftwareOnly(); + } + String name = mediaCodecInfo.getName().toLowerCase(); + if (name.startsWith("arc.")) { // App Runtime for Chrome (ARC) codecs + return false; + } + return name.startsWith("omx.google.") + || name.startsWith("omx.ffmpeg.") + || (name.startsWith("omx.sec.") && name.contains(".sw.")) + || name.equals("omx.qcom.video.decoder.hevcswvdec") + || name.startsWith("c2.android.") + || name.startsWith("c2.google.") + || (!name.startsWith("omx.") && !name.startsWith("c2.")); + } + + /** + * Filter broken codecs by name and device model. + * + * Note: + * There is no way to know broken encoders so we will check by name and device. + * Please add your encoder to this method if you detect one. + * + * @param codecs All device codecs + * @return a list without broken codecs + */ + private static List filterBrokenCodecs(List codecs) { + List listFilter = new ArrayList<>(); + for (MediaCodecInfo mediaCodecInfo : codecs) { + if (isValid(mediaCodecInfo.getName())) { + listFilter.add(mediaCodecInfo); + } + } + return listFilter; + } + + /** + * For now, none broken codec reported. + */ + private static boolean isValid(String name) { + return true; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/PCMUtil.java b/encoder/src/main/java/com/pedro/encoder/utils/PCMUtil.java new file mode 100644 index 0000000..5613041 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/PCMUtil.java @@ -0,0 +1,62 @@ +package com.pedro.encoder.utils; + +/** + * Created by pedro on 3/07/17. + */ +public class PCMUtil { + + //no tested + //see https://stackoverflow.com/questions/15652432/how-to-mix-overlay-two-mp3-audio-file-into-one-mp3-file-not-concatenate/33255658#33255658 + public static byte[] mixPCM(byte[] pcm1, byte[] pcm2) { + int len1 = pcm1.length; + int len2 = pcm2.length; + byte[] pcmL; + byte[] pcmS; + int lenL; // length of the longest + int lenS; // length of the shortest + if (len2 > len1) { + lenL = len1; + pcmL = pcm1; + lenS = len2; + pcmS = pcm2; + } else { + lenL = len2; + pcmL = pcm2; + lenS = len1; + pcmS = pcm1; + } + for (int idx = 0; idx < lenL; idx++) { + int sample; + if (idx >= lenS) { + sample = pcmL[idx]; + } else { + sample = pcmL[idx] + pcmS[idx]; + } + sample = (int) (sample * .71); + if (sample > 127) sample = 127; + if (sample < -128) sample = -128; + pcmL[idx] = (byte) sample; + } + return pcmL; + } + + private static final byte[] pcmBufferStereo = new byte[4096]; + + /** + * Experimental method to downgrade pcm with 3 channels or more to stereo. + * + * @return pcm buffer in stereo (2 channels) + */ + public static byte[] pcmToStereo(byte[] pcm, int channels) { + int cont = 0; + for (int i = 0; i < pcm.length; i += channels) { + byte channel1 = pcm[i]; + byte channel2 = pcm[i + 1]; + + pcmBufferStereo[cont] = channel1; + pcmBufferStereo[cont + 1] = channel2; + cont += 2; + } + return pcmBufferStereo; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/GifStreamObject.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/GifStreamObject.java new file mode 100644 index 0000000..7547795 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/GifStreamObject.java @@ -0,0 +1,96 @@ +package com.pedro.encoder.utils.gl; + +import android.graphics.Bitmap; +import android.util.Log; +import com.pedro.encoder.utils.gl.gif.GifDecoder; +import java.io.IOException; +import java.io.InputStream; + +/** + * Created by pedro on 22/09/17. + */ + +public class GifStreamObject extends StreamObjectBase { + + private static final String TAG = "GifStreamObject"; + + private int numFrames; + private Bitmap[] gifBitmaps; + private int[] gifDelayFrames; + private long startDelayFrame; + private int currentGifFrame; + + public GifStreamObject() { + } + + @Override + public int getWidth() { + return gifBitmaps != null ? gifBitmaps[0].getWidth() : 0; + } + + @Override + public int getHeight() { + return gifBitmaps != null ? gifBitmaps[0].getHeight() : 0; + } + + public void load(InputStream inputStreamGif) throws IOException { + GifDecoder gifDecoder = new GifDecoder(); + if (gifDecoder.read(inputStreamGif, inputStreamGif.available()) == 0) { + Log.i(TAG, "read gif ok"); + numFrames = gifDecoder.getFrameCount(); + gifDelayFrames = new int[numFrames]; + gifBitmaps = new Bitmap[numFrames]; + for (int i = 0; i < numFrames; i++) { + gifDecoder.advance(); + gifBitmaps[i] = gifDecoder.getNextFrame(); + gifDelayFrames[i] = gifDecoder.getNextDelay(); + } + Log.i(TAG, "finish load gif frames"); + } else { + throw new IOException("Read gif error"); + } + } + + @Override + public void recycle() { + if (gifBitmaps != null) { + for (int i = 0; i < numFrames; i++) { + if (gifBitmaps[i] != null) gifBitmaps[i].recycle(); + } + } + } + + @Override + public int getNumFrames() { + return numFrames; + } + + @Override + public Bitmap[] getBitmaps() { + return gifBitmaps; + } + + public int[] getGifDelayFrames() { + return gifDelayFrames; + } + + public int updateFrame(int size) { + return size <= 1 ? 0 : updateFrame(); + } + + @Override + public int updateFrame() { + if (startDelayFrame == 0) { + startDelayFrame = System.currentTimeMillis(); + } + if (System.currentTimeMillis() - startDelayFrame >= gifDelayFrames[currentGifFrame]) { + if (currentGifFrame >= numFrames - 1) { + currentGifFrame = 0; + } else { + currentGifFrame++; + } + startDelayFrame = 0; + } + return currentGifFrame; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/GlUtil.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/GlUtil.java new file mode 100644 index 0000000..48cdc43 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/GlUtil.java @@ -0,0 +1,161 @@ +package com.pedro.encoder.utils.gl; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Matrix; +import android.opengl.EGL14; +import android.opengl.GLES11Ext; +import android.opengl.GLES20; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.util.Log; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; + +/** + * Created by pedro on 9/09/17. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class GlUtil { + + private static final String TAG = "GlUtil"; + + public static int loadShader(int shaderType, String source) { + int shader = GLES20.glCreateShader(shaderType); + checkGlError("glCreateShader type=" + shaderType); + GLES20.glShaderSource(shader, source); + GLES20.glCompileShader(shader); + int[] compiled = new int[1]; + GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); + if (compiled[0] == 0) { + Log.e(TAG, "Could not compile shader " + shaderType + ":"); + Log.e(TAG, " " + GLES20.glGetShaderInfoLog(shader)); + GLES20.glDeleteShader(shader); + shader = 0; + } + return shader; + } + + public static int createProgram(String vertexSource, String fragmentSource) { + int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource); + if (vertexShader == 0) { + return 0; + } + int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); + if (pixelShader == 0) { + return 0; + } + + int program = GLES20.glCreateProgram(); + checkGlError("glCreateProgram"); + if (program == 0) { + Log.e(TAG, "Could not create program"); + } + GLES20.glAttachShader(program, vertexShader); + checkGlError("glAttachShader"); + GLES20.glAttachShader(program, pixelShader); + checkGlError("glAttachShader"); + GLES20.glLinkProgram(program); + int[] linkStatus = new int[1]; + GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); + if (linkStatus[0] != GLES20.GL_TRUE) { + Log.e(TAG, "Could not link program: "); + Log.e(TAG, GLES20.glGetProgramInfoLog(program)); + GLES20.glDeleteProgram(program); + program = 0; + } + return program; + } + + public static void createTextures(int cantidad, int[] texturesId, int position) { + GLES20.glGenTextures(cantidad, texturesId, position); + for (int i = 0; i < cantidad; i++) { + GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + position + i); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texturesId[position + i]); + GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); + GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, + GLES20.GL_CLAMP_TO_EDGE); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, + GLES20.GL_CLAMP_TO_EDGE); + } + } + + public static void createExternalTextures(int cantidad, int[] texturesId, int position) { + GLES20.glGenTextures(cantidad, texturesId, position); + for (int i = 0; i < cantidad; i++) { + GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + position + i); + GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, texturesId[position + i]); + GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, + GLES20.GL_LINEAR); + GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, + GLES20.GL_LINEAR); + GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, + GLES20.GL_CLAMP_TO_EDGE); + GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, + GLES20.GL_CLAMP_TO_EDGE); + } + } + + public static String getStringFromRaw(Context context, int id) { + String str; + try { + Resources r = context.getResources(); + InputStream is = r.openRawResource(id); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + int i = is.read(); + while (i != -1) { + baos.write(i); + i = is.read(); + } + str = baos.toString(); + is.close(); + } catch (IOException e) { + str = ""; + } + return str; + } + + public static void checkGlError(String op) { + int error = GLES20.glGetError(); + if (error != GLES20.GL_NO_ERROR) { + Log.e(TAG, op + ": glError " + error); + throw new RuntimeException(op + ": glError " + error); + } + } + + public static void checkEglError(String msg) { + int error = EGL14.eglGetError(); + if (error != EGL14.EGL_SUCCESS) { + throw new RuntimeException(msg + ": EGL error: 0x" + Integer.toHexString(error)); + } + } + + public static Bitmap getBitmap(int originalWidth, int originalHeight, int finalWidth, + int finalHeight) { + //Get opengl buffer + ByteBuffer buffer = ByteBuffer.allocateDirect(originalWidth * originalHeight * 4); + GLES20.glReadPixels(0, 0, originalWidth, originalHeight, GLES20.GL_RGBA, + GLES20.GL_UNSIGNED_BYTE, buffer); + //Create bitmap preview resolution + Bitmap bitmap = Bitmap.createBitmap(originalWidth, originalHeight, Bitmap.Config.ARGB_8888); + //Set buffer to bitmap + bitmap.copyPixelsFromBuffer(buffer); + //Scale to stream resolution + bitmap = Bitmap.createScaledBitmap(bitmap, finalWidth, finalHeight, false); + //Flip vertical + return flipVerticalBitmap(bitmap, finalWidth, finalHeight); + } + + private static Bitmap flipVerticalBitmap(Bitmap bitmap, int width, int height) { + float cx = width / 2f; + float cy = height / 2f; + Matrix matrix = new Matrix(); + matrix.postScale(1f, -1f, cx, cy); + return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/ImageStreamObject.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/ImageStreamObject.java new file mode 100644 index 0000000..fa0d7e2 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/ImageStreamObject.java @@ -0,0 +1,55 @@ +package com.pedro.encoder.utils.gl; + +import android.graphics.Bitmap; +import android.util.Log; + +/** + * Created by pedro on 23/09/17. + */ + +public class ImageStreamObject extends StreamObjectBase { + + private static final String TAG = "ImageStreamObject"; + + private int numFrames; + private Bitmap imageBitmap; + + public ImageStreamObject() { + } + + @Override + public int getWidth() { + return imageBitmap != null ? imageBitmap.getWidth() : 0; + } + + @Override + public int getHeight() { + return imageBitmap != null ? imageBitmap.getHeight() : 0; + } + + public void load(Bitmap imageBitmap) { + this.imageBitmap = imageBitmap; + numFrames = 1; + Log.i(TAG, "finish load image"); + } + + @Override + public void recycle() { + if (imageBitmap != null) imageBitmap.recycle(); + } + + @Override + public int getNumFrames() { + return numFrames; + } + + @Override + public Bitmap[] getBitmaps() { + return new Bitmap[]{imageBitmap}; + } + + @Override + public int updateFrame() { + return 0; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/SizeCalculator.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/SizeCalculator.java new file mode 100644 index 0000000..c75df66 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/SizeCalculator.java @@ -0,0 +1,62 @@ +package com.pedro.encoder.utils.gl; + +import android.graphics.PointF; +import android.opengl.GLES20; +import android.opengl.Matrix; + +/** + * Created by pedro on 22/03/19. + */ + +public class SizeCalculator { + + public static void calculateViewPort(boolean keepAspectRatio, int mode, int previewWidth, + int previewHeight, int streamWidth, int streamHeight) { + if (keepAspectRatio) { + if (previewWidth > previewHeight) { //landscape + if (mode == 0) { //adjust + int realWidth = previewHeight * streamWidth / streamHeight; + GLES20.glViewport((previewWidth - realWidth) / 2, 0, realWidth, previewHeight); + } else { //fill + int realHeight = previewWidth * streamHeight / streamWidth; + GLES20.glViewport(0, -((realHeight - previewWidth) / 2), previewWidth, realHeight); + } + } else { //portrait + if (mode == 0) { //adjust + int realHeight = previewWidth * streamHeight / streamWidth; + GLES20.glViewport(0, (previewHeight - realHeight) / 2, previewWidth, realHeight); + } else { //fill + int realWidth = previewHeight * streamWidth / streamHeight; + GLES20.glViewport(-((realWidth - previewWidth) / 2), 0, realWidth, previewHeight); + } + } + } else { + GLES20.glViewport(0, 0, previewHeight, previewWidth); + } + } + + public static void updateMatrix(int rotation, int width, int height, boolean isPreview, + boolean isPortrait, float[] MVPMatrix) { + Matrix.setIdentityM(MVPMatrix, 0); + PointF scale = getScale(rotation, width, height, isPortrait, isPreview); + Matrix.scaleM(MVPMatrix, 0, scale.x, scale.y, 1f); + if (!isPreview && !isPortrait) rotation += 90; + Matrix.rotateM(MVPMatrix, 0, rotation, 0f, 0f, -1f); + } + + private static PointF getScale(int rotation, int width, int height, boolean isPortrait, + boolean isPreview) { + float scaleX = 1f; + float scaleY = 1f; + if (!isPreview) { + if (isPortrait && rotation != 90 && rotation != 270) { //portrait + final float adjustedWidth = width * (width / (float) height); + scaleX = adjustedWidth / height; + //} else if (!isPortrait && rotation != 90 && rotation != 270) { //landscape + // final float adjustedWidth = height * (height / (float) width); + // scaleX = adjustedWidth / width; + } + } + return new PointF(scaleX, scaleY); + } +} \ No newline at end of file diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/StreamObjectBase.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/StreamObjectBase.java new file mode 100644 index 0000000..9b7000e --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/StreamObjectBase.java @@ -0,0 +1,22 @@ +package com.pedro.encoder.utils.gl; + +import android.graphics.Bitmap; + +/** + * Created by pedro on 9/10/17. + */ + +public abstract class StreamObjectBase { + + public abstract int getWidth(); + + public abstract int getHeight(); + + public abstract int updateFrame(); + + public abstract void recycle(); + + public abstract int getNumFrames(); + + public abstract Bitmap[] getBitmaps(); +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/TextStreamObject.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/TextStreamObject.java new file mode 100644 index 0000000..c96113b --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/TextStreamObject.java @@ -0,0 +1,79 @@ +package com.pedro.encoder.utils.gl; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.Typeface; +import android.util.Log; + +/** + * Created by pedro on 23/09/17. + */ + +public class TextStreamObject extends StreamObjectBase { + + private static final String TAG = "TextStreamObject"; + + private int numFrames; + private Bitmap imageBitmap; + + public TextStreamObject() { + } + + @Override + public int getWidth() { + return imageBitmap != null ? imageBitmap.getWidth() : 0; + } + + @Override + public int getHeight() { + return imageBitmap != null ? imageBitmap.getHeight() : 0; + } + + public void load(String text, float textSize, int textColor, Typeface typeface) { + numFrames = 1; + imageBitmap = textAsBitmap(text, textSize, textColor, typeface); + Log.i(TAG, "finish load text"); + } + + @Override + public void recycle() { + if (imageBitmap != null) imageBitmap.recycle(); + } + + private Bitmap textAsBitmap(String text, float textSize, int textColor, Typeface typeface) { + Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + paint.setTextSize(textSize); + paint.setColor(textColor); + paint.setAlpha(255); + if (typeface != null) paint.setTypeface(typeface); + paint.setTextAlign(Paint.Align.LEFT); + + float baseline = -paint.ascent(); // ascent() is negative + int width = (int) (paint.measureText(text) + 0.5f); // round + int height = (int) (baseline + paint.descent() + 0.5f); + Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(image); + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + + canvas.drawText(text, 0, baseline, paint); + return image; + } + + @Override + public int getNumFrames() { + return numFrames; + } + + @Override + public Bitmap[] getBitmaps() { + return new Bitmap[]{imageBitmap}; + } + + @Override + public int updateFrame() { + return 0; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/TranslateTo.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/TranslateTo.java new file mode 100644 index 0000000..45b4df3 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/TranslateTo.java @@ -0,0 +1,10 @@ +package com.pedro.encoder.utils.gl; + +/** + * Created by pedro on 18/11/17. + */ + +public enum TranslateTo { + + CENTER, LEFT, RIGHT, TOP, BOTTOM, TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifDecoder.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifDecoder.java new file mode 100644 index 0000000..5f8d8bc --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifDecoder.java @@ -0,0 +1,930 @@ +/** + * Copyright (c) 2013 Xcellent Creations, Inc. + * Copyright 2014 Google, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.pedro.encoder.utils.gl.gif; + +import android.annotation.TargetApi; +import android.graphics.Bitmap; +import android.os.Build; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.util.Log; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; + +/** + * Reads frame data from a GIF image source and decodes it into individual frames + * for animation purposes. Image data can be read from either and InputStream source + * or a byte[]. + * + * This class is optimized for running animations with the frames, there + * are no methods to get individual frame images, only to decode the next frame in the + * animation sequence. Instead, it lowers its memory footprint by only housing the minimum + * data necessary to decode the next frame in the animation sequence. + * + * The animation must be manually moved forward using {@link #advance()} before requesting the next + * frame. This method must also be called before you request the first frame or an error will + * occur. + * + * Implementation adapted from sample code published in Lyons. (2004). Java for Programmers, + * republished under the MIT Open Source License + */ +public class GifDecoder { + private static final String TAG = GifDecoder.class.getSimpleName(); + + /** + * File read status: No errors. + */ + static final int STATUS_OK = 0; + /** + * File read status: Error decoding file (may be partially decoded). + */ + static final int STATUS_FORMAT_ERROR = 1; + /** + * File read status: Unable to open source. + */ + static final int STATUS_OPEN_ERROR = 2; + /** + * Unable to fully decode the current frame. + */ + static final int STATUS_PARTIAL_DECODE = 3; + /** + * max decoder pixel stack size. + */ + private static final int MAX_STACK_SIZE = 4096; + + /** + * GIF Disposal Method meaning take no action. + */ + private static final int DISPOSAL_UNSPECIFIED = 0; + /** + * GIF Disposal Method meaning leave canvas from previous frame. + */ + private static final int DISPOSAL_NONE = 1; + /** + * GIF Disposal Method meaning clear canvas to background color. + */ + private static final int DISPOSAL_BACKGROUND = 2; + /** + * GIF Disposal Method meaning clear canvas to frame before last. + */ + private static final int DISPOSAL_PREVIOUS = 3; + + private static final int NULL_CODE = -1; + + private static final int INITIAL_FRAME_POINTER = -1; + + static final int LOOP_FOREVER = -1; + + private static final int BYTES_PER_INTEGER = 4; + + // Global File Header values and parsing flags. + // Active color table. + private int[] act; + // Private color table that can be modified if needed. + private final int[] pct = new int[256]; + + // Raw GIF data from input source. + private ByteBuffer rawData; + + // Raw data read working array. + private byte[] block; + + // Temporary buffer for block reading. Reads 16k chunks from the native buffer for processing, + // to greatly reduce JNI overhead. + private static final int WORK_BUFFER_SIZE = 16384; + @Nullable private byte[] workBuffer; + private int workBufferSize = 0; + private int workBufferPosition = 0; + + private GifHeaderParser parser; + + // LZW decoder working arrays. + private short[] prefix; + private byte[] suffix; + private byte[] pixelStack; + private byte[] mainPixels; + private int[] mainScratch; + + private int framePointer; + private int loopIndex; + private GifHeader header; + private BitmapProvider bitmapProvider; + private Bitmap previousImage; + private boolean savePrevious; + private int status; + private int sampleSize; + private int downsampledHeight; + private int downsampledWidth; + private boolean isFirstFrameTransparent; + + /** + * An interface that can be used to provide reused {@link Bitmap}s to avoid GCs + * from constantly allocating {@link Bitmap}s for every frame. + */ + interface BitmapProvider { + /** + * Returns an {@link Bitmap} with exactly the given dimensions and config. + * + * @param width The width in pixels of the desired {@link Bitmap}. + * @param height The height in pixels of the desired {@link Bitmap}. + * @param config The {@link Bitmap.Config} of the desired {@link + * Bitmap}. + */ + @NonNull + Bitmap obtain(int width, int height, Bitmap.Config config); + + /** + * Releases the given Bitmap back to the pool. + */ + void release(Bitmap bitmap); + + /** + * Returns a byte array used for decoding and generating the frame bitmap. + * + * @param size the size of the byte array to obtain + */ + byte[] obtainByteArray(int size); + + /** + * Releases the given byte array back to the pool. + */ + void release(byte[] bytes); + + /** + * Returns an int array used for decoding/generating the frame bitmaps. + */ + int[] obtainIntArray(int size); + + /** + * Release the given array back to the pool. + */ + void release(int[] array); + } + + public GifDecoder(BitmapProvider provider, GifHeader gifHeader, ByteBuffer rawData) { + this(provider, gifHeader, rawData, 1 /*sampleSize*/); + } + + public GifDecoder(BitmapProvider provider, GifHeader gifHeader, ByteBuffer rawData, + int sampleSize) { + this(provider); + setData(gifHeader, rawData, sampleSize); + } + + public GifDecoder(BitmapProvider provider) { + this.bitmapProvider = provider; + header = new GifHeader(); + } + + public GifDecoder() { + this(new SimpleBitmapProvider()); + } + + public int getWidth() { + return header.width; + } + + public int getHeight() { + return header.height; + } + + ByteBuffer getData() { + return rawData; + } + + /** + * Returns the current status of the decoder. + * + *

Status will update per frame to allow the caller to tell whether or not the current frame + * was decoded successfully and/or completely. Format and open failures persist across frames. + *

+ */ + public int getStatus() { + return status; + } + + /** + * Move the animation frame counter forward. + * + * @return boolean specifying if animation should continue or if loopCount has been fulfilled. + */ + public boolean advance() { + if (header.frameCount <= 0) { + return false; + } + + if (framePointer == getFrameCount() - 1) { + loopIndex++; + } + + if (header.loopCount != LOOP_FOREVER && loopIndex > header.loopCount) { + return false; + } + + framePointer = (framePointer + 1) % header.frameCount; + return true; + } + + /** + * Gets display duration for specified frame. + * + * @param n int index of frame. + * @return delay in milliseconds. + */ + public int getDelay(int n) { + int delay = -1; + if ((n >= 0) && (n < header.frameCount)) { + delay = header.frames.get(n).delay; + } + return delay; + } + + /** + * Gets display duration for the upcoming frame in ms. + */ + public int getNextDelay() { + if (header.frameCount <= 0 || framePointer < 0) { + return 0; + } + + return getDelay(framePointer); + } + + /** + * Gets the number of frames read from file. + * + * @return frame count. + */ + public int getFrameCount() { + return header.frameCount; + } + + /** + * Gets the current index of the animation frame, or -1 if animation hasn't not yet started. + * + * @return frame index. + */ + public int getCurrentFrameIndex() { + return framePointer; + } + + /** + * Sets the frame pointer to a specific frame + * + * @return boolean true if the move was successful + */ + public boolean setFrameIndex(int frame) { + if (frame < INITIAL_FRAME_POINTER || frame >= getFrameCount()) { + return false; + } + framePointer = frame; + return true; + } + + /** + * Resets the frame pointer to before the 0th frame, as if we'd never used this decoder to + * decode any frames. + */ + public void resetFrameIndex() { + framePointer = INITIAL_FRAME_POINTER; + } + + /** + * Resets the loop index to the first loop. + */ + public void resetLoopIndex() { + loopIndex = 0; + } + + /** + * Gets the "Netscape" iteration count, if any. A count of 0 means repeat indefinitely. + * + * @return iteration count if one was specified, else 1. + */ + public int getLoopCount() { + return header.loopCount; + } + + /** + * Gets the number of loops that have been shown. + * + * @return iteration count. + */ + public int getLoopIndex() { + return loopIndex; + } + + /** + * Returns an estimated byte size for this decoder based on the data provided to {@link + * #setData(GifHeader, byte[])}, as well as internal buffers. + */ + public int getByteSize() { + return rawData.limit() + mainPixels.length + (mainScratch.length * BYTES_PER_INTEGER); + } + + /** + * Get the next frame in the animation sequence. + * + * @return Bitmap representation of frame. + */ + public synchronized Bitmap getNextFrame() { + if (header.frameCount <= 0 || framePointer < 0) { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "unable to decode frame, frameCount=" + + header.frameCount + + " framePointer=" + + framePointer); + } + status = STATUS_FORMAT_ERROR; + } + if (status == STATUS_FORMAT_ERROR || status == STATUS_OPEN_ERROR) { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "Unable to decode frame, status=" + status); + } + return null; + } + status = STATUS_OK; + + GifFrame currentFrame = header.frames.get(framePointer); + GifFrame previousFrame = null; + int previousIndex = framePointer - 1; + if (previousIndex >= 0) { + previousFrame = header.frames.get(previousIndex); + } + + // Set the appropriate color table. + act = currentFrame.lct != null ? currentFrame.lct : header.gct; + if (act == null) { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "No Valid Color Table for frame #" + framePointer); + } + // No color table defined. + status = STATUS_FORMAT_ERROR; + return null; + } + + // Reset the transparent pixel in the color table + if (currentFrame.transparency) { + // Prepare local copy of color table ("pct = act"), see #1068 + System.arraycopy(act, 0, pct, 0, act.length); + // Forget about act reference from shared header object, use copied version + act = pct; + // Set transparent color if specified. + act[currentFrame.transIndex] = 0; + } + + // Transfer pixel data to image. + return setPixels(currentFrame, previousFrame); + } + + /** + * Reads GIF image from stream. + * + * @param is containing GIF file. + * @return read status code (0 = no errors). + */ + public int read(InputStream is, int contentLength) { + if (is != null) { + try { + int capacity = (contentLength > 0) ? (contentLength + 4096) : 16384; + ByteArrayOutputStream buffer = new ByteArrayOutputStream(capacity); + int nRead; + byte[] data = new byte[16384]; + while ((nRead = is.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + buffer.flush(); + + read(buffer.toByteArray()); + } catch (IOException e) { + Log.w(TAG, "Error reading data from stream", e); + } + } else { + status = STATUS_OPEN_ERROR; + } + + try { + if (is != null) { + is.close(); + } + } catch (IOException e) { + Log.w(TAG, "Error closing stream", e); + } + + return status; + } + + public void clear() { + header = null; + if (mainPixels != null) { + bitmapProvider.release(mainPixels); + } + if (mainScratch != null) { + bitmapProvider.release(mainScratch); + } + if (previousImage != null) { + bitmapProvider.release(previousImage); + } + previousImage = null; + rawData = null; + isFirstFrameTransparent = false; + if (block != null) { + bitmapProvider.release(block); + } + if (workBuffer != null) { + bitmapProvider.release(workBuffer); + } + } + + public synchronized void setData(GifHeader header, byte[] data) { + setData(header, ByteBuffer.wrap(data)); + } + + public synchronized void setData(GifHeader header, ByteBuffer buffer) { + setData(header, buffer, 1); + } + + public synchronized void setData(GifHeader header, ByteBuffer buffer, int sampleSize) { + if (sampleSize <= 0) { + throw new IllegalArgumentException("Sample size must be >=0, not: " + sampleSize); + } + // Make sure sample size is a power of 2. + sampleSize = Integer.highestOneBit(sampleSize); + this.status = STATUS_OK; + this.header = header; + isFirstFrameTransparent = false; + framePointer = INITIAL_FRAME_POINTER; + resetLoopIndex(); + // Initialize the raw data buffer. + rawData = buffer.asReadOnlyBuffer(); + rawData.position(0); + rawData.order(ByteOrder.LITTLE_ENDIAN); + + // No point in specially saving an old frame if we're never going to use it. + savePrevious = false; + for (GifFrame frame : header.frames) { + if (frame.dispose == DISPOSAL_PREVIOUS) { + savePrevious = true; + break; + } + } + + this.sampleSize = sampleSize; + downsampledWidth = header.width / sampleSize; + downsampledHeight = header.height / sampleSize; + // Now that we know the size, init scratch arrays. + // TODO Find a way to avoid this entirely or at least downsample it (either should be possible). + mainPixels = bitmapProvider.obtainByteArray(header.width * header.height); + mainScratch = bitmapProvider.obtainIntArray(downsampledWidth * downsampledHeight); + } + + private GifHeaderParser getHeaderParser() { + if (parser == null) { + parser = new GifHeaderParser(); + } + return parser; + } + + /** + * Reads GIF image from byte array. + * + * @param data containing GIF file. + * @return read status code (0 = no errors). + */ + public synchronized int read(byte[] data) { + this.header = getHeaderParser().setData(data).parseHeader(); + if (data != null) { + setData(header, data); + } + + return status; + } + + /** + * Creates new frame image from current data (and previous frames as specified by their + * disposition codes). + */ + private Bitmap setPixels(GifFrame currentFrame, GifFrame previousFrame) { + // Final location of blended pixels. + final int[] dest = mainScratch; + + // clear all pixels when meet first frame + if (previousFrame == null) { + Arrays.fill(dest, 0); + } + + // fill in starting image contents based on last image's dispose code + if (previousFrame != null && previousFrame.dispose > DISPOSAL_UNSPECIFIED) { + // We don't need to do anything for DISPOSAL_NONE, if it has the correct pixels so will our + // mainScratch and therefore so will our dest array. + if (previousFrame.dispose == DISPOSAL_BACKGROUND) { + // Start with a canvas filled with the background color + int c = 0; + if (!currentFrame.transparency) { + c = header.bgColor; + if (currentFrame.lct != null && header.bgIndex == currentFrame.transIndex) { + c = 0; + } + } else if (framePointer == 0) { + // TODO: We should check and see if all individual pixels are replaced. If they are, the + // first frame isn't actually transparent. For now, it's simpler and safer to assume + // drawing a transparent background means the GIF contains transparency. + isFirstFrameTransparent = true; + } + fillRect(dest, previousFrame, c); + } else if (previousFrame.dispose == DISPOSAL_PREVIOUS) { + if (previousImage == null) { + fillRect(dest, previousFrame, 0); + } else { + // Start with the previous frame + int downsampledIH = previousFrame.ih / sampleSize; + int downsampledIY = previousFrame.iy / sampleSize; + int downsampledIW = previousFrame.iw / sampleSize; + int downsampledIX = previousFrame.ix / sampleSize; + int topLeft = downsampledIY * downsampledWidth + downsampledIX; + previousImage.getPixels(dest, topLeft, downsampledWidth, downsampledIX, downsampledIY, + downsampledIW, downsampledIH); + } + } + } + + // Decode pixels for this frame into the global pixels[] scratch. + decodeBitmapData(currentFrame); + + int downsampledIH = currentFrame.ih / sampleSize; + int downsampledIY = currentFrame.iy / sampleSize; + int downsampledIW = currentFrame.iw / sampleSize; + int downsampledIX = currentFrame.ix / sampleSize; + // Copy each source line to the appropriate place in the destination. + int pass = 1; + int inc = 8; + int iline = 0; + boolean isFirstFrame = framePointer == 0; + for (int i = 0; i < downsampledIH; i++) { + int line = i; + if (currentFrame.interlace) { + if (iline >= downsampledIH) { + pass++; + switch (pass) { + case 2: + iline = 4; + break; + case 3: + iline = 2; + inc = 4; + break; + case 4: + iline = 1; + inc = 2; + break; + default: + break; + } + } + line = iline; + iline += inc; + } + line += downsampledIY; + if (line < downsampledHeight) { + int k = line * downsampledWidth; + // Start of line in dest. + int dx = k + downsampledIX; + // End of dest line. + int dlim = dx + downsampledIW; + if (k + downsampledWidth < dlim) { + // Past dest edge. + dlim = k + downsampledWidth; + } + // Start of line in source. + int sx = i * sampleSize * currentFrame.iw; + int maxPositionInSource = sx + ((dlim - dx) * sampleSize); + while (dx < dlim) { + // Map color and insert in destination. + int averageColor; + if (sampleSize == 1) { + int currentColorIndex = ((int) mainPixels[sx]) & 0x000000ff; + averageColor = act[currentColorIndex]; + } else { + // TODO: This is substantially slower (up to 50ms per frame) than just grabbing the + // current color index above, even with a sample size of 1. + averageColor = averageColorsNear(sx, maxPositionInSource, currentFrame.iw); + } + if (averageColor != 0) { + dest[dx] = averageColor; + } else if (!isFirstFrameTransparent && isFirstFrame) { + isFirstFrameTransparent = true; + } + sx += sampleSize; + dx++; + } + } + } + + // Copy pixels into previous image + if (savePrevious && (currentFrame.dispose == DISPOSAL_UNSPECIFIED + || currentFrame.dispose == DISPOSAL_NONE)) { + if (previousImage == null) { + previousImage = getNextBitmap(); + } + previousImage.setPixels(dest, 0, downsampledWidth, 0, 0, downsampledWidth, downsampledHeight); + } + + // Set pixels for current image. + Bitmap result = getNextBitmap(); + result.setPixels(dest, 0, downsampledWidth, 0, 0, downsampledWidth, downsampledHeight); + return result; + } + + private void fillRect(int[] dest, GifFrame frame, int bgColor) { + // The area used by the graphic must be restored to the background color. + int downsampledIH = frame.ih / sampleSize; + int downsampledIY = frame.iy / sampleSize; + int downsampledIW = frame.iw / sampleSize; + int downsampledIX = frame.ix / sampleSize; + int topLeft = downsampledIY * downsampledWidth + downsampledIX; + int bottomLeft = topLeft + downsampledIH * downsampledWidth; + for (int left = topLeft; left < bottomLeft; left += downsampledWidth) { + int right = left + downsampledIW; + for (int pointer = left; pointer < right; pointer++) { + dest[pointer] = bgColor; + } + } + } + + private int averageColorsNear(int positionInMainPixels, int maxPositionInMainPixels, + int currentFrameIw) { + int alphaSum = 0; + int redSum = 0; + int greenSum = 0; + int blueSum = 0; + + int totalAdded = 0; + // Find the pixels in the current row. + for (int i = positionInMainPixels; i < positionInMainPixels + sampleSize + && i < mainPixels.length + && i < maxPositionInMainPixels; i++) { + int currentColorIndex = ((int) mainPixels[i]) & 0xff; + int currentColor = act[currentColorIndex]; + if (currentColor != 0) { + alphaSum += currentColor >> 24 & 0x000000ff; + redSum += currentColor >> 16 & 0x000000ff; + greenSum += currentColor >> 8 & 0x000000ff; + blueSum += currentColor & 0x000000ff; + totalAdded++; + } + } + // Find the pixels in the next row. + for (int i = positionInMainPixels + currentFrameIw; + i < positionInMainPixels + currentFrameIw + sampleSize + && i < mainPixels.length + && i < maxPositionInMainPixels; i++) { + int currentColorIndex = ((int) mainPixels[i]) & 0xff; + int currentColor = act[currentColorIndex]; + if (currentColor != 0) { + alphaSum += currentColor >> 24 & 0x000000ff; + redSum += currentColor >> 16 & 0x000000ff; + greenSum += currentColor >> 8 & 0x000000ff; + blueSum += currentColor & 0x000000ff; + totalAdded++; + } + } + if (totalAdded == 0) { + return 0; + } else { + return ((alphaSum / totalAdded) << 24) | ((redSum / totalAdded) << 16) | ((greenSum + / totalAdded) << 8) | (blueSum / totalAdded); + } + } + + /** + * Decodes LZW image data into pixel array. Adapted from John Cristy's BitmapMagick. + */ + private void decodeBitmapData(GifFrame frame) { + workBufferSize = 0; + workBufferPosition = 0; + if (frame != null) { + // Jump to the frame start position. + rawData.position(frame.bufferFrameStart); + } + + int npix = (frame == null) ? header.width * header.height : frame.iw * frame.ih; + int available, clear, codeMask, codeSize, endOfInformation, inCode, oldCode, bits, code, count, + i, datum, dataSize, first, top, bi, pi; + + if (mainPixels == null || mainPixels.length < npix) { + // Allocate new pixel array. + mainPixels = bitmapProvider.obtainByteArray(npix); + } + if (prefix == null) { + prefix = new short[MAX_STACK_SIZE]; + } + if (suffix == null) { + suffix = new byte[MAX_STACK_SIZE]; + } + if (pixelStack == null) { + pixelStack = new byte[MAX_STACK_SIZE + 1]; + } + + // Initialize GIF data stream decoder. + dataSize = readByte(); + clear = 1 << dataSize; + endOfInformation = clear + 1; + available = clear + 2; + oldCode = NULL_CODE; + codeSize = dataSize + 1; + codeMask = (1 << codeSize) - 1; + for (code = 0; code < clear; code++) { + // XXX ArrayIndexOutOfBoundsException. + prefix[code] = 0; + suffix[code] = (byte) code; + } + + // Decode GIF pixel stream. + datum = bits = count = first = top = pi = bi = 0; + for (i = 0; i < npix; ) { + // Load bytes until there are enough bits for a code. + if (count == 0) { + // Read a new data block. + count = readBlock(); + if (count <= 0) { + status = STATUS_PARTIAL_DECODE; + break; + } + bi = 0; + } + + datum += (((int) block[bi]) & 0xff) << bits; + bits += 8; + bi++; + count--; + + while (bits >= codeSize) { + // Get the next code. + code = datum & codeMask; + datum >>= codeSize; + bits -= codeSize; + + // Interpret the code. + if (code == clear) { + // Reset decoder. + codeSize = dataSize + 1; + codeMask = (1 << codeSize) - 1; + available = clear + 2; + oldCode = NULL_CODE; + continue; + } + + if (code > available) { + status = STATUS_PARTIAL_DECODE; + break; + } + + if (code == endOfInformation) { + break; + } + + if (oldCode == NULL_CODE) { + pixelStack[top++] = suffix[code]; + oldCode = code; + first = code; + continue; + } + inCode = code; + if (code >= available) { + pixelStack[top++] = (byte) first; + code = oldCode; + } + while (code >= clear) { + pixelStack[top++] = suffix[code]; + code = prefix[code]; + } + first = ((int) suffix[code]) & 0xff; + pixelStack[top++] = (byte) first; + + // Add a new string to the string table. + if (available < MAX_STACK_SIZE) { + prefix[available] = (short) oldCode; + suffix[available] = (byte) first; + available++; + if (((available & codeMask) == 0) && (available < MAX_STACK_SIZE)) { + codeSize++; + codeMask += available; + } + } + oldCode = inCode; + + while (top > 0) { + // Pop a pixel off the pixel stack. + mainPixels[pi++] = pixelStack[--top]; + i++; + } + } + } + + // Clear missing pixels. + for (i = pi; i < npix; i++) { + mainPixels[i] = 0; + } + } + + /** + * Reads the next chunk for the intermediate work buffer. + */ + private void readChunkIfNeeded() { + if (workBufferSize > workBufferPosition) { + return; + } + if (workBuffer == null) { + workBuffer = bitmapProvider.obtainByteArray(WORK_BUFFER_SIZE); + } + workBufferPosition = 0; + workBufferSize = Math.min(rawData.remaining(), WORK_BUFFER_SIZE); + rawData.get(workBuffer, 0, workBufferSize); + } + + /** + * Reads a single byte from the input stream. + */ + private int readByte() { + try { + readChunkIfNeeded(); + return workBuffer[workBufferPosition++] & 0xFF; + } catch (Exception e) { + status = STATUS_FORMAT_ERROR; + return 0; + } + } + + /** + * Reads next variable length block from input. + * + * @return number of bytes stored in "buffer". + */ + private int readBlock() { + int blockSize = readByte(); + if (blockSize > 0) { + try { + if (block == null) { + block = bitmapProvider.obtainByteArray(255); + } + final int remaining = workBufferSize - workBufferPosition; + if (remaining >= blockSize) { + // Block can be read from the current work buffer. + System.arraycopy(workBuffer, workBufferPosition, block, 0, blockSize); + workBufferPosition += blockSize; + } else if (rawData.remaining() + remaining >= blockSize) { + // Block can be read in two passes. + System.arraycopy(workBuffer, workBufferPosition, block, 0, remaining); + workBufferPosition = workBufferSize; + readChunkIfNeeded(); + final int secondHalfRemaining = blockSize - remaining; + System.arraycopy(workBuffer, 0, block, remaining, secondHalfRemaining); + workBufferPosition += secondHalfRemaining; + } else { + status = STATUS_FORMAT_ERROR; + } + } catch (Exception e) { + Log.w(TAG, "Error Reading Block", e); + status = STATUS_FORMAT_ERROR; + } + } + return blockSize; + } + + private Bitmap getNextBitmap() { + Bitmap.Config config = + isFirstFrameTransparent ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; + Bitmap result = bitmapProvider.obtain(downsampledWidth, downsampledHeight, config); + setAlpha(result); + return result; + } + + @TargetApi(12) + private static void setAlpha(Bitmap bitmap) { + if (Build.VERSION.SDK_INT >= 12) { + bitmap.setHasAlpha(true); + } + } +} \ No newline at end of file diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifFrame.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifFrame.java new file mode 100644 index 0000000..70f81d3 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifFrame.java @@ -0,0 +1,54 @@ +/** + * Copyright 2014 Google, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.pedro.encoder.utils.gl.gif; + +/** + * Inner model class housing metadata for each frame. + */ +class GifFrame { + int ix, iy, iw, ih; + /** + * Control Flag. + */ + boolean interlace; + /** + * Control Flag. + */ + boolean transparency; + /** + * Disposal Method. + */ + int dispose; + /** + * Transparency Index. + */ + int transIndex; + /** + * Delay, in ms, to next frame. + */ + int delay; + /** + * Index in the raw buffer where we need to start reading to decode. + */ + int bufferFrameStart; + /** + * Local Color Table. + */ + int[] lct; +} \ No newline at end of file diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeader.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeader.java new file mode 100644 index 0000000..3336c5f --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeader.java @@ -0,0 +1,75 @@ +/** + * Copyright 2014 Google, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.pedro.encoder.utils.gl.gif; + +import java.util.ArrayList; +import java.util.List; + +/** + * A header object containing the number of frames in an animated GIF image as well as basic + * metadata like width and height that can be used to decode each individual frame of the GIF. Can + * be shared by one or more {@link GifDecoder}s to play the same animated GIF in multiple views. + */ +public class GifHeader { + + int[] gct = null; + int status = GifDecoder.STATUS_OK; + int frameCount = 0; + + GifFrame currentFrame; + List frames = new ArrayList<>(); + // Logical screen size. + // Full image width. + int width; + // Full image height. + int height; + + // 1 : global color table flag. + boolean gctFlag; + // 2-4 : color resolution. + // 5 : gct sort flag. + // 6-8 : gct size. + int gctSize; + // Background color index. + int bgIndex; + // Pixel aspect ratio. + int pixelAspect; + //TODO: this is set both during reading the header and while decoding frames... + int bgColor; + int loopCount = 0; + + public int getHeight() { + return height; + } + + public int getWidth() { + return width; + } + + public int getNumFrames() { + return frameCount; + } + + /** + * Global status code of GIF data parsing. + */ + public int getStatus() { + return status; + } +} \ No newline at end of file diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeaderParser.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeaderParser.java new file mode 100644 index 0000000..9503edb --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/GifHeaderParser.java @@ -0,0 +1,425 @@ +/** + * Copyright 2014 Google, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.pedro.encoder.utils.gl.gif; + +import android.util.Log; + +import java.nio.BufferUnderflowException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; + +/** + * A class responsible for creating {@link GifHeader}s from data + * representing animated gifs. + */ +public class GifHeaderParser { + public static final String TAG = "GifHeaderParser"; + + // The minimum frame delay in hundredths of a second. + static final int MIN_FRAME_DELAY = 2; + // The default frame delay in hundredths of a second for GIFs with frame delays less than the + // minimum. + static final int DEFAULT_FRAME_DELAY = 10; + + private static final int MAX_BLOCK_SIZE = 256; + // Raw data read working array. + private final byte[] block = new byte[MAX_BLOCK_SIZE]; + + private ByteBuffer rawData; + private GifHeader header; + private int blockSize = 0; + + public GifHeaderParser setData(ByteBuffer data) { + reset(); + rawData = data.asReadOnlyBuffer(); + rawData.position(0); + rawData.order(ByteOrder.LITTLE_ENDIAN); + return this; + } + + public GifHeaderParser setData(byte[] data) { + if (data != null) { + setData(ByteBuffer.wrap(data)); + } else { + rawData = null; + header.status = GifDecoder.STATUS_OPEN_ERROR; + } + return this; + } + + public void clear() { + rawData = null; + header = null; + } + + private void reset() { + rawData = null; + Arrays.fill(block, (byte) 0); + header = new GifHeader(); + blockSize = 0; + } + + public GifHeader parseHeader() { + if (rawData == null) { + throw new IllegalStateException("You must call setData() before parseHeader()"); + } + if (err()) { + return header; + } + + readHeader(); + if (!err()) { + readContents(); + if (header.frameCount < 0) { + header.status = GifDecoder.STATUS_FORMAT_ERROR; + } + } + + return header; + } + + /** + * Determines if the GIF is animated by trying to read in the first 2 frames + * This method reparses the data even if the header has already been read. + */ + public boolean isAnimated() { + readHeader(); + if (!err()) { + readContents(2 /* maxFrames */); + } + return header.frameCount > 1; + } + + /** + * Main file parser. Reads GIF content blocks. + */ + private void readContents() { + readContents(Integer.MAX_VALUE /* maxFrames */); + } + + /** + * Main file parser. Reads GIF content blocks. Stops after reading maxFrames + */ + private void readContents(int maxFrames) { + // Read GIF file content blocks. + boolean done = false; + while (!(done || err() || header.frameCount > maxFrames)) { + int code = read(); + switch (code) { + // Image separator. + case 0x2C: + // The graphics control extension is optional, but will always come first if it exists. + // If one did + // exist, there will be a non-null current frame which we should use. However if one + // did not exist, + // the current frame will be null and we must create it here. See issue #134. + if (header.currentFrame == null) { + header.currentFrame = new GifFrame(); + } + readBitmap(); + break; + // Extension. + case 0x21: + code = read(); + switch (code) { + // Graphics control extension. + case 0xf9: + // Start a new frame. + header.currentFrame = new GifFrame(); + readGraphicControlExt(); + break; + // Application extension. + case 0xff: + readBlock(); + String app = ""; + for (int i = 0; i < 11; i++) { + app += (char) block[i]; + } + if (app.equals("NETSCAPE2.0")) { + readNetscapeExt(); + } else { + // Don't care. + skip(); + } + break; + // Comment extension. + case 0xfe: + skip(); + break; + // Plain text extension. + case 0x01: + skip(); + break; + // Uninteresting extension. + default: + skip(); + } + break; + // Terminator. + case 0x3b: + done = true; + break; + // Bad byte, but keep going and see what happens break; + case 0x00: + default: + header.status = GifDecoder.STATUS_FORMAT_ERROR; + } + } + } + + /** + * Reads Graphics Control Extension values. + */ + private void readGraphicControlExt() { + // Block size. + read(); + // Packed fields. + int packed = read(); + // Disposal method. + header.currentFrame.dispose = (packed & 0x1c) >> 2; + if (header.currentFrame.dispose == 0) { + // Elect to keep old image if discretionary. + header.currentFrame.dispose = 1; + } + header.currentFrame.transparency = (packed & 1) != 0; + // Delay in milliseconds. + int delayInHundredthsOfASecond = readShort(); + // TODO: consider allowing -1 to indicate show forever. + if (delayInHundredthsOfASecond < MIN_FRAME_DELAY) { + delayInHundredthsOfASecond = DEFAULT_FRAME_DELAY; + } + header.currentFrame.delay = delayInHundredthsOfASecond * 10; + // Transparent color index + header.currentFrame.transIndex = read(); + // Block terminator + read(); + } + + /** + * Reads next frame image. + */ + private void readBitmap() { + // (sub)image position & size. + header.currentFrame.ix = readShort(); + header.currentFrame.iy = readShort(); + header.currentFrame.iw = readShort(); + header.currentFrame.ih = readShort(); + + int packed = read(); + // 1 - local color table flag interlace + boolean lctFlag = (packed & 0x80) != 0; + int lctSize = (int) Math.pow(2, (packed & 0x07) + 1); + // 3 - sort flag + // 4-5 - reserved lctSize = 2 << (packed & 7); // 6-8 - local color + // table size + header.currentFrame.interlace = (packed & 0x40) != 0; + if (lctFlag) { + // Read table. + header.currentFrame.lct = readColorTable(lctSize); + } else { + // No local color table. + header.currentFrame.lct = null; + } + + // Save this as the decoding position pointer. + header.currentFrame.bufferFrameStart = rawData.position(); + + // False decode pixel data to advance buffer. + skipImageData(); + + if (err()) { + return; + } + + header.frameCount++; + // Add image to frame. + header.frames.add(header.currentFrame); + } + + /** + * Reads Netscape extension to obtain iteration count. + */ + private void readNetscapeExt() { + do { + readBlock(); + if (block[0] == 1) { + // Loop count sub-block. + int b1 = ((int) block[1]) & 0xff; + int b2 = ((int) block[2]) & 0xff; + header.loopCount = (b2 << 8) | b1; + if (header.loopCount == 0) { + header.loopCount = GifDecoder.LOOP_FOREVER; + } + } + } while ((blockSize > 0) && !err()); + } + + /** + * Reads GIF file header information. + */ + private void readHeader() { + String id = ""; + for (int i = 0; i < 6; i++) { + id += (char) read(); + } + if (!id.startsWith("GIF")) { + header.status = GifDecoder.STATUS_FORMAT_ERROR; + return; + } + readLSD(); + if (header.gctFlag && !err()) { + header.gct = readColorTable(header.gctSize); + header.bgColor = header.gct[header.bgIndex]; + } + } + + /** + * Reads Logical Screen Descriptor. + */ + private void readLSD() { + // Logical screen size. + header.width = readShort(); + header.height = readShort(); + // Packed fields + int packed = read(); + // 1 : global color table flag. + header.gctFlag = (packed & 0x80) != 0; + // 2-4 : color resolution. + // 5 : gct sort flag. + // 6-8 : gct size. + header.gctSize = 2 << (packed & 7); + // Background color index. + header.bgIndex = read(); + // Pixel aspect ratio + header.pixelAspect = read(); + } + + /** + * Reads color table as 256 RGB integer values. + * + * @param ncolors int number of colors to read. + * @return int array containing 256 colors (packed ARGB with full alpha). + */ + private int[] readColorTable(int ncolors) { + int nbytes = 3 * ncolors; + int[] tab = null; + byte[] c = new byte[nbytes]; + + try { + rawData.get(c); + + // TODO: what bounds checks are we avoiding if we know the number of colors? + // Max size to avoid bounds checks. + tab = new int[MAX_BLOCK_SIZE]; + int i = 0; + int j = 0; + while (i < ncolors) { + int r = ((int) c[j++]) & 0xff; + int g = ((int) c[j++]) & 0xff; + int b = ((int) c[j++]) & 0xff; + tab[i++] = 0xff000000 | (r << 16) | (g << 8) | b; + } + } catch (BufferUnderflowException e) { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "Format Error Reading Color Table", e); + } + header.status = GifDecoder.STATUS_FORMAT_ERROR; + } + + return tab; + } + + /** + * Skips LZW image data for a single frame to advance buffer. + */ + private void skipImageData() { + // lzwMinCodeSize + read(); + // data sub-blocks + skip(); + } + + /** + * Skips variable length blocks up to and including next zero length block. + */ + private void skip() { + try { + int blockSize; + do { + blockSize = read(); + rawData.position(rawData.position() + blockSize); + } while (blockSize > 0); + } catch (IllegalArgumentException ex) { + } + } + + /** + * Reads next variable length block from input. + * + * @return number of bytes stored in "buffer" + */ + private int readBlock() { + blockSize = read(); + int n = 0; + if (blockSize > 0) { + int count = 0; + try { + while (n < blockSize) { + count = blockSize - n; + rawData.get(block, n, count); + + n += count; + } + } catch (Exception e) { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, + "Error Reading Block n: " + n + " count: " + count + " blockSize: " + blockSize, e); + } + header.status = GifDecoder.STATUS_FORMAT_ERROR; + } + } + return n; + } + + /** + * Reads a single byte from the input stream. + */ + private int read() { + int curByte = 0; + try { + curByte = rawData.get() & 0xFF; + } catch (Exception e) { + header.status = GifDecoder.STATUS_FORMAT_ERROR; + } + return curByte; + } + + /** + * Reads next 16-bit value, LSB first. + */ + private int readShort() { + // Read 16-bit value. + return rawData.getShort(); + } + + private boolean err() { + return header.status != GifDecoder.STATUS_OK; + } +} \ No newline at end of file diff --git a/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/SimpleBitmapProvider.java b/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/SimpleBitmapProvider.java new file mode 100644 index 0000000..e738040 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/gl/gif/SimpleBitmapProvider.java @@ -0,0 +1,37 @@ +package com.pedro.encoder.utils.gl.gif; + +import android.graphics.Bitmap; +import androidx.annotation.NonNull; + +final class SimpleBitmapProvider implements GifDecoder.BitmapProvider { + @NonNull + @Override + public Bitmap obtain(int width, int height, Bitmap.Config config) { + return Bitmap.createBitmap(width, height, config); + } + + @Override + public void release(Bitmap bitmap) { + bitmap.recycle(); + } + + @Override + public byte[] obtainByteArray(int size) { + return new byte[size]; + } + + @Override + public void release(byte[] bytes) { + // no-op + } + + @Override + public int[] obtainIntArray(int size) { + return new int[size]; + } + + @Override + public void release(int[] array) { + // no-op + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/yuv/NV21Utils.java b/encoder/src/main/java/com/pedro/encoder/utils/yuv/NV21Utils.java new file mode 100644 index 0000000..198d9af --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/yuv/NV21Utils.java @@ -0,0 +1,204 @@ +package com.pedro.encoder.utils.yuv; + +/** + * Created by pedro on 31/10/18. + */ + +public class NV21Utils { + + private static byte[] preAllocatedBufferRotate; + private static byte[] preAllocatedBufferColor; + + public static void preAllocateBuffers(int length) { + preAllocatedBufferRotate = new byte[length]; + preAllocatedBufferColor = new byte[length]; + } + + public static int[] toARGB(byte[] yuv, int width, int height) { + int[] argb = new int[width * height]; + final int frameSize = width * height; + final int ii = 0; + final int ij = 0; + final int di = +1; + final int dj = +1; + int a = 0; + for (int i = 0, ci = ii; i < height; ++i, ci += di) { + for (int j = 0, cj = ij; j < width; ++j, cj += dj) { + int y = (0xff & ((int) yuv[ci * width + cj])); + int v = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 0])); + int u = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 1])); + y = y < 16 ? 16 : y; + int r = (int) (1.164f * (y - 16) + 1.596f * (v - 128)); + int g = (int) (1.164f * (y - 16) - 0.813f * (v - 128) - 0.391f * (u - 128)); + int b = (int) (1.164f * (y - 16) + 2.018f * (u - 128)); + r = r < 0 ? 0 : (r > 255 ? 255 : r); + g = g < 0 ? 0 : (g > 255 ? 255 : g); + b = b < 0 ? 0 : (b > 255 ? 255 : b); + argb[a++] = 0xff000000 | (r << 16) | (g << 8) | b; + } + } + return argb; + } + + public static byte[] toYV12(byte[] input, int width, int height) { + final int frameSize = width * height; + final int qFrameSize = frameSize / 4; + System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y + for (int i = 0; i < qFrameSize; i++) { + preAllocatedBufferColor[frameSize + i + qFrameSize] = input[frameSize + i * 2 + 1]; // Cb (U) + preAllocatedBufferColor[frameSize + i] = input[frameSize + i * 2]; // Cr (V) + } + return preAllocatedBufferColor; + } + + // the color transform, @see http://stackoverflow.com/questions/15739684/mediacodec-and-camera-color-space-incorrect + public static byte[] toNV12(byte[] input, int width, int height) { + final int frameSize = width * height; + final int qFrameSize = frameSize / 4; + System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y + for (int i = 0; i < qFrameSize; i++) { + preAllocatedBufferColor[frameSize + i * 2] = input[frameSize + i * 2 + 1]; // Cb (U) + preAllocatedBufferColor[frameSize + i * 2 + 1] = input[frameSize + i * 2]; // Cr (V) + } + return preAllocatedBufferColor; + } + + public static byte[] toI420(byte[] input, int width, int height) { + final int frameSize = width * height; + final int qFrameSize = frameSize / 4; + System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y + for (int i = 0; i < qFrameSize; i++) { + preAllocatedBufferColor[frameSize + i] = input[frameSize + i * 2 + 1]; // Cb (U) + preAllocatedBufferColor[frameSize + i + qFrameSize] = input[frameSize + i * 2]; // Cr (V) + } + return preAllocatedBufferColor; + } + + public static byte[] rotate90(byte[] data, int imageWidth, int imageHeight) { + // Rotate the Y luma + int i = 0; + for (int x = 0; x < imageWidth; x++) { + for (int y = imageHeight - 1; y >= 0; y--) { + preAllocatedBufferRotate[i++] = data[y * imageWidth + x]; + } + } + // Rotate the U and V color components + int size = imageWidth * imageHeight; + i = size * 3 / 2 - 1; + for (int x = imageWidth - 1; x > 0; x = x - 2) { + for (int y = 0; y < imageHeight / 2; y++) { + preAllocatedBufferRotate[i--] = data[size + (y * imageWidth) + x]; + preAllocatedBufferRotate[i--] = data[size + (y * imageWidth) + (x - 1)]; + } + } + return preAllocatedBufferRotate; + } + + public static byte[] rotate180(byte[] data, int imageWidth, int imageHeight) { + int count = 0; + for (int i = imageWidth * imageHeight - 1; i >= 0; i--) { + preAllocatedBufferRotate[count] = data[i]; + count++; + } + for (int i = imageWidth * imageHeight * 3 / 2 - 1; i >= imageWidth * imageHeight; i -= 2) { + preAllocatedBufferRotate[count++] = data[i - 1]; + preAllocatedBufferRotate[count++] = data[i]; + } + return preAllocatedBufferRotate; + } + + public static byte[] rotate270(byte[] data, int imageWidth, int imageHeight) { + // Rotate the Y luma + int i = 0; + for (int x = imageWidth - 1; x >= 0; x--) { + for (int y = 0; y < imageHeight; y++) { + preAllocatedBufferRotate[i++] = data[y * imageWidth + x]; + } + } + + // Rotate the U and V color components + i = imageWidth * imageHeight; + int uvHeight = imageHeight / 2; + for (int x = imageWidth - 1; x >= 0; x -= 2) { + for (int y = imageHeight; y < uvHeight + imageHeight; y++) { + preAllocatedBufferRotate[i++] = data[y * imageWidth + x - 1]; + preAllocatedBufferRotate[i++] = data[y * imageWidth + x]; + } + } + return preAllocatedBufferRotate; + } + + public static byte[] rotatePixels(byte[] input, int width, int height, int rotation) { + byte[] output = new byte[input.length]; + + boolean swap = (rotation == 90 || rotation == 270); + boolean yflip = (rotation == 90 || rotation == 180); + boolean xflip = (rotation == 270 || rotation == 180); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int xo = x, yo = y; + int w = width, h = height; + int xi = xo, yi = yo; + if (swap) { + xi = w * yo / h; + yi = h * xo / w; + } + if (yflip) { + yi = h - yi - 1; + } + if (xflip) { + xi = w - xi - 1; + } + output[w * yo + xo] = input[w * yi + xi]; + int fs = w * h; + int qs = (fs >> 2); + xi = (xi >> 1); + yi = (yi >> 1); + xo = (xo >> 1); + yo = (yo >> 1); + w = (w >> 1); + h = (h >> 1); + // adjust for interleave here + int ui = fs + (w * yi + xi) * 2; + int uo = fs + (w * yo + xo) * 2; + // and here + int vi = ui + 1; + int vo = uo + 1; + output[uo] = input[ui]; + output[vo] = input[vi]; + } + } + return output; + } + + public static byte[] mirror(byte[] input, int width, int height) { + byte[] output = new byte[input.length]; + + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + int xo = x, yo = y; + int w = width, h = height; + int xi = xo, yi = yo; + yi = h - yi - 1; + output[w * yo + xo] = input[w * yi + xi]; + int fs = w * h; + int qs = (fs >> 2); + xi = (xi >> 1); + yi = (yi >> 1); + xo = (xo >> 1); + yo = (yo >> 1); + w = (w >> 1); + h = (h >> 1); + // adjust for interleave here + int ui = fs + (w * yi + xi) * 2; + int uo = fs + (w * yo + xo) * 2; + // and here + int vi = ui + 1; + int vo = uo + 1; + output[uo] = input[ui]; + output[vo] = input[vi]; + } + } + return output; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/yuv/YUVUtil.java b/encoder/src/main/java/com/pedro/encoder/utils/yuv/YUVUtil.java new file mode 100644 index 0000000..37b5430 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/yuv/YUVUtil.java @@ -0,0 +1,244 @@ +package com.pedro.encoder.utils.yuv; + +import android.graphics.Bitmap; +import android.media.MediaCodecInfo; +import com.pedro.encoder.Frame; +import com.pedro.encoder.video.FormatVideoEncoder; + +/** + * Created by pedro on 25/01/17. + * https://wiki.videolan.org/YUV/#I420 + * + * Example YUV images 4x4 px. + * + * NV21 example: + * + * Y1 Y2 Y3 Y4 + * Y5 Y6 Y7 Y8 + * Y9 Y10 Y11 Y12 + * Y13 Y14 Y15 Y16 + * U1 V1 U2 V2 + * U3 V3 U4 V4 + * + * + * YV12 example: + * + * Y1 Y2 Y3 Y4 + * Y5 Y6 Y7 Y8 + * Y9 Y10 Y11 Y12 + * Y13 Y14 Y15 Y16 + * U1 U2 U3 U4 + * V1 V2 V3 V4 + * + * + * YUV420 planar example (I420): + * + * Y1 Y2 Y3 Y4 + * Y5 Y6 Y7 Y8 + * Y9 Y10 Y11 Y12 + * Y13 Y14 Y15 Y16 + * V1 V2 V3 V4 + * U1 U2 U3 U4 + * + * + * YUV420 semi planar example (NV12): + * + * Y1 Y2 Y3 Y4 + * Y5 Y6 Y7 Y8 + * Y9 Y10 Y11 Y12 + * Y13 Y14 Y15 Y16 + * V1 U1 V2 U2 + * V3 U3 V4 U4 + */ + +public class YUVUtil { + + + public static void preAllocateBuffers(int length) { + NV21Utils.preAllocateBuffers(length); + YV12Utils.preAllocateBuffers(length); + } + + public static byte[] NV21toYUV420byColor(byte[] input, int width, int height, + FormatVideoEncoder formatVideoEncoder) { + switch (formatVideoEncoder) { + case YUV420PLANAR: + return NV21Utils.toI420(input, width, height); + case YUV420SEMIPLANAR: + return NV21Utils.toNV12(input, width, height); + default: + return null; + } + } + + public static byte[] rotateNV21(byte[] data, int width, int height, int rotation) { + switch (rotation) { + case 0: + return data; + case 90: + return NV21Utils.rotate90(data, width, height); + case 180: + return NV21Utils.rotate180(data, width, height); + case 270: + return NV21Utils.rotate270(data, width, height); + default: + return null; + } + } + + public static byte[] YV12toYUV420byColor(byte[] input, int width, int height, + FormatVideoEncoder formatVideoEncoder) { + switch (formatVideoEncoder) { + case YUV420PLANAR: + return YV12Utils.toI420(input, width, height); + case YUV420SEMIPLANAR: + return YV12Utils.toNV12(input, width, height); + default: + return null; + } + } + + public static byte[] rotateYV12(byte[] data, int width, int height, int rotation) { + switch (rotation) { + case 0: + return data; + case 90: + return YV12Utils.rotate90(data, width, height); + case 180: + return YV12Utils.rotate180(data, width, height); + case 270: + return YV12Utils.rotate270(data, width, height); + default: + return null; + } + } + + public static Bitmap frameToBitmap(Frame frame, int width, int height, int orientation) { + int w = (orientation == 90 || orientation == 270) ? height : width; + int h = (orientation == 90 || orientation == 270) ? width : height; + int[] argb = NV21Utils.toARGB(rotateNV21(frame.getBuffer(), width, height, orientation), w, h); + return Bitmap.createBitmap(argb, w, h, Bitmap.Config.ARGB_8888); + } + + public static byte[] ARGBtoYUV420SemiPlanar(int[] input, int width, int height) { + /* + * COLOR_FormatYUV420SemiPlanar is NV12 + */ + final int frameSize = width * height; + byte[] yuv420sp = new byte[width * height * 3 / 2]; + int yIndex = 0; + int uvIndex = frameSize; + + int a, R, G, B, Y, U, V; + int index = 0; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + + a = (input[index] & 0xff000000) >> 24; // a is not used obviously + R = (input[index] & 0xff0000) >> 16; + G = (input[index] & 0xff00) >> 8; + B = (input[index] & 0xff) >> 0; + + // well known RGB to YUV algorithm + Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16; + U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128; + V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128; + + // NV21 has a plane of Y and interleaved planes of VU each sampled by a factor of 2 + // meaning for every 4 Y pixels there are 1 V and 1 U. Note the sampling is every other + // pixel AND every other scanline. + yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y)); + if (j % 2 == 0 && index % 2 == 0) { + yuv420sp[uvIndex++] = (byte) ((V < 0) ? 0 : ((V > 255) ? 255 : V)); + yuv420sp[uvIndex++] = (byte) ((U < 0) ? 0 : ((U > 255) ? 255 : U)); + } + + index++; + } + } + return yuv420sp; + } + + public static byte[] CropYuv(int src_format, byte[] src_yuv, int src_width, int src_height, + int dst_width, int dst_height) { + byte[] dst_yuv; + if (src_yuv == null) return null; + // simple implementation: copy the corner + if (src_width == dst_width && src_height == dst_height) { + dst_yuv = src_yuv; + } else { + dst_yuv = new byte[(int) (dst_width * dst_height * 1.5)]; + switch (src_format) { + case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar: // I420 + case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedPlanar: // YV12 + { + // copy Y + int src_yoffset = 0; + int dst_yoffset = 0; + for (int i = 0; i < dst_height; i++) { + System.arraycopy(src_yuv, src_yoffset, dst_yuv, dst_yoffset, dst_width); + src_yoffset += src_width; + dst_yoffset += dst_width; + } + + // copy u + int src_uoffset = 0; + int dst_uoffset = 0; + src_yoffset = src_width * src_height; + dst_yoffset = dst_width * dst_height; + for (int i = 0; i < dst_height / 2; i++) { + System.arraycopy(src_yuv, src_yoffset + src_uoffset, dst_yuv, dst_yoffset + dst_uoffset, + dst_width / 2); + src_uoffset += src_width / 2; + dst_uoffset += dst_width / 2; + } + + // copy v + int src_voffset = 0; + int dst_voffset = 0; + src_uoffset = src_width * src_height + src_width * src_height / 4; + dst_uoffset = dst_width * dst_height + dst_width * dst_height / 4; + for (int i = 0; i < dst_height / 2; i++) { + System.arraycopy(src_yuv, src_uoffset + src_voffset, dst_yuv, dst_uoffset + dst_voffset, + dst_width / 2); + src_voffset += src_width / 2; + dst_voffset += dst_width / 2; + } + } + break; + case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar: // NV12 + case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedSemiPlanar: // NV21 + case MediaCodecInfo.CodecCapabilities.COLOR_TI_FormatYUV420PackedSemiPlanar: + case MediaCodecInfo.CodecCapabilities.COLOR_QCOM_FormatYUV420SemiPlanar: { + // copy Y + int src_yoffset = 0; + int dst_yoffset = 0; + for (int i = 0; i < dst_height; i++) { + System.arraycopy(src_yuv, src_yoffset, dst_yuv, dst_yoffset, dst_width); + src_yoffset += src_width; + dst_yoffset += dst_width; + } + + // copy u and v + int src_uoffset = 0; + int dst_uoffset = 0; + src_yoffset = src_width * src_height; + dst_yoffset = dst_width * dst_height; + for (int i = 0; i < dst_height / 2; i++) { + System.arraycopy(src_yuv, src_yoffset + src_uoffset, dst_yuv, dst_yoffset + dst_uoffset, + dst_width); + src_uoffset += src_width; + dst_uoffset += dst_width; + } + } + break; + + default: { + dst_yuv = null; + } + break; + } + } + return dst_yuv; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/utils/yuv/YV12Utils.java b/encoder/src/main/java/com/pedro/encoder/utils/yuv/YV12Utils.java new file mode 100644 index 0000000..c287289 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/utils/yuv/YV12Utils.java @@ -0,0 +1,123 @@ +package com.pedro.encoder.utils.yuv; + +/** + * Created by pedro on 31/10/18. + */ + +public class YV12Utils { + + private static byte[] preAllocatedBufferRotate; + private static byte[] preAllocatedBufferColor; + + public static void preAllocateBuffers(int length) { + preAllocatedBufferRotate = new byte[length]; + preAllocatedBufferColor = new byte[length]; + } + + // the color transform, @see http://stackoverflow.com/questions/15739684/mediacodec-and-camera-color-space-incorrect + public static byte[] toNV12(byte[] input, int width, int height) { + final int frameSize = width * height; + final int qFrameSize = frameSize / 4; + System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y + for (int i = 0; i < qFrameSize; i++) { + preAllocatedBufferColor[frameSize + i * 2] = input[frameSize + i + qFrameSize]; // Cb (U) + preAllocatedBufferColor[frameSize + i * 2 + 1] = input[frameSize + i]; // Cr (V) + } + return preAllocatedBufferColor; + } + + public static byte[] toI420(byte[] input, int width, int height) { + final int frameSize = width * height; + final int qFrameSize = frameSize / 4; + System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y + System.arraycopy(input, frameSize + qFrameSize, preAllocatedBufferColor, frameSize, + qFrameSize); // Cb (U) + System.arraycopy(input, frameSize, preAllocatedBufferColor, frameSize + qFrameSize, + qFrameSize); // Cr (V) + return preAllocatedBufferColor; + } + + public static byte[] toNV21(byte[] input, int width, int height) { + final int frameSize = width * height; + final int qFrameSize = frameSize / 4; + System.arraycopy(input, 0, preAllocatedBufferColor, 0, frameSize); // Y + for (int i = 0; i < qFrameSize; i++) { + preAllocatedBufferColor[frameSize + i * 2 + 1] = input[frameSize + i + qFrameSize]; // Cb (U) + preAllocatedBufferColor[frameSize + i * 2] = input[frameSize + i]; // Cr (V) + } + return preAllocatedBufferColor; + } + + public static byte[] rotate90(byte[] data, int imageWidth, int imageHeight) { + // Rotate the Y luma + int i = 0; + for (int x = 0; x < imageWidth; x++) { + for (int y = imageHeight - 1; y >= 0; y--) { + preAllocatedBufferRotate[i++] = data[y * imageWidth + x]; + } + } + final int size = imageWidth * imageHeight; + final int colorSize = size / 4; + final int colorHeight = colorSize / imageWidth; + // Rotate the U and V color components + for (int x = 0; x < imageWidth / 2; x++) { + for (int y = colorHeight - 1; y >= 0; y--) { + //V + preAllocatedBufferRotate[i + colorSize] = + data[colorSize + size + (imageWidth * y) + x + (imageWidth / 2)]; + preAllocatedBufferRotate[i + colorSize + 1] = data[colorSize + size + (imageWidth * y) + x]; + //U + preAllocatedBufferRotate[i++] = data[size + (imageWidth * y) + x + (imageWidth / 2)]; + preAllocatedBufferRotate[i++] = data[size + (imageWidth * y) + x]; + } + } + return preAllocatedBufferRotate; + } + + public static byte[] rotate180(byte[] data, int imageWidth, int imageHeight) { + int count = 0; + final int size = imageWidth * imageHeight; + for (int i = size - 1; i >= 0; i--) { + preAllocatedBufferRotate[count++] = data[i]; + } + final int midColorSize = size / 4; + //U + for (int i = size + midColorSize - 1; i >= size; i--) { + preAllocatedBufferRotate[count++] = data[i]; + } + //V + for (int i = data.length - 1; i >= imageWidth * imageHeight + midColorSize; i--) { + preAllocatedBufferRotate[count++] = data[i]; + } + return preAllocatedBufferRotate; + } + + public static byte[] rotate270(byte[] data, int imageWidth, int imageHeight) { + // Rotate the Y luma + int i = 0; + for (int x = imageWidth - 1; x >= 0; x--) { + for (int y = 0; y < imageHeight; y++) { + preAllocatedBufferRotate[i++] = data[y * imageWidth + x]; + } + } + + // Rotate the U and V color components + final int size = imageWidth * imageHeight; + final int colorSize = size / 4; + final int colorHeight = colorSize / imageWidth; + + for (int x = 0; x < imageWidth / 2; x++) { + for (int y = 0; y < colorHeight; y++) { + //V + preAllocatedBufferRotate[i + colorSize] = + data[colorSize + size + (imageWidth * y) - x + (imageWidth / 2) - 1]; + preAllocatedBufferRotate[i + colorSize + 1] = + data[colorSize + size + (imageWidth * y) - x + imageWidth - 1]; + //U + preAllocatedBufferRotate[i++] = data[size + (imageWidth * y) - x + (imageWidth / 2) - 1]; + preAllocatedBufferRotate[i++] = data[size + (imageWidth * y) - x + imageWidth - 1]; + } + } + return preAllocatedBufferRotate; + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/video/FormatVideoEncoder.java b/encoder/src/main/java/com/pedro/encoder/video/FormatVideoEncoder.java new file mode 100644 index 0000000..bd5b412 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/video/FormatVideoEncoder.java @@ -0,0 +1,49 @@ +package com.pedro.encoder.video; + +import android.media.MediaCodecInfo; + +/** + * Created by pedro on 21/01/17. + */ + +public enum FormatVideoEncoder { + + YUV420FLEXIBLE, YUV420PLANAR, YUV420SEMIPLANAR, YUV420PACKEDPLANAR, YUV420PACKEDSEMIPLANAR, + YUV422FLEXIBLE, YUV422PLANAR, YUV422SEMIPLANAR, YUV422PACKEDPLANAR, YUV422PACKEDSEMIPLANAR, + YUV444FLEXIBLE, YUV444INTERLEAVED, SURFACE, + //take first valid color for encoder (YUV420PLANAR, YUV420SEMIPLANAR or YUV420PACKEDPLANAR) + YUV420Dynamical; + + public int getFormatCodec() { + switch (this) { + case YUV420FLEXIBLE: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible; + case YUV420PLANAR: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar; + case YUV420SEMIPLANAR: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar; + case YUV420PACKEDPLANAR: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedPlanar; + case YUV420PACKEDSEMIPLANAR: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedSemiPlanar; + case YUV422FLEXIBLE: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422Flexible; + case YUV422PLANAR: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422Planar; + case YUV422SEMIPLANAR: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422SemiPlanar; + case YUV422PACKEDPLANAR: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422PackedPlanar; + case YUV422PACKEDSEMIPLANAR: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422PackedSemiPlanar; + case YUV444FLEXIBLE: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV444Flexible; + case YUV444INTERLEAVED: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV444Interleaved; + case SURFACE: + return MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface; + default: + return -1; + } + } +} diff --git a/encoder/src/main/java/com/pedro/encoder/video/GetVideoData.java b/encoder/src/main/java/com/pedro/encoder/video/GetVideoData.java new file mode 100644 index 0000000..1596f65 --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/video/GetVideoData.java @@ -0,0 +1,21 @@ +package com.pedro.encoder.video; + +import android.media.MediaCodec; + +import android.media.MediaFormat; +import java.nio.ByteBuffer; + +/** + * Created by pedro on 20/01/17. + */ + +public interface GetVideoData { + + void onSpsPps(ByteBuffer sps, ByteBuffer pps); + + void onSpsPpsVps(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps); + + void getVideoData(ByteBuffer h264Buffer, MediaCodec.BufferInfo info); + + void onVideoFormat(MediaFormat mediaFormat); +} diff --git a/encoder/src/main/java/com/pedro/encoder/video/VideoEncoder.java b/encoder/src/main/java/com/pedro/encoder/video/VideoEncoder.java new file mode 100644 index 0000000..a3e14bc --- /dev/null +++ b/encoder/src/main/java/com/pedro/encoder/video/VideoEncoder.java @@ -0,0 +1,507 @@ +package com.pedro.encoder.video; + +import android.graphics.ImageFormat; +import android.media.MediaCodec; +import android.media.MediaCodecInfo; +import android.media.MediaFormat; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.util.Pair; +import android.view.Surface; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.BaseEncoder; +import com.pedro.encoder.Frame; +import com.pedro.encoder.input.video.FpsLimiter; +import com.pedro.encoder.input.video.GetCameraData; +import com.pedro.encoder.utils.CodecUtil; +import com.pedro.encoder.utils.yuv.YUVUtil; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; + +/** + * Created by pedro on 19/01/17. + * This class need use same resolution, fps and imageFormat that Camera1ApiManagerGl + */ + +public class VideoEncoder extends BaseEncoder implements GetCameraData { + + private static final String TAG = "VideoEncoder"; + private GetVideoData getVideoData; + private boolean spsPpsSetted = false; + private boolean hardwareRotation = false; + + //surface to buffer encoder + private Surface inputSurface; + + private int width = 640; + private int height = 480; + private int fps = 30; + private int bitRate = 1200 * 1024; //in kbps + private int rotation = 90; + private int iFrameInterval = 2; + //for disable video + private FpsLimiter fpsLimiter = new FpsLimiter(); + private String type = CodecUtil.H264_MIME; + private FormatVideoEncoder formatVideoEncoder = FormatVideoEncoder.YUV420Dynamical; + private int avcProfile = -1; + private int avcProfileLevel = -1; + private HandlerThread handlerThread; + private BlockingQueue queue = new ArrayBlockingQueue<>(80); + + public VideoEncoder(GetVideoData getVideoData) { + this.getVideoData = getVideoData; + } + + public boolean prepareVideoEncoder(int width, int height, int fps, int bitRate, int rotation, + boolean hardwareRotation, int iFrameInterval, FormatVideoEncoder formatVideoEncoder) { + return prepareVideoEncoder(width, height, fps, bitRate, rotation, hardwareRotation, + iFrameInterval, formatVideoEncoder, -1, -1); + } + + /** + * Prepare encoder with custom parameters + */ + public boolean prepareVideoEncoder(int width, int height, int fps, int bitRate, int rotation, + boolean hardwareRotation, int iFrameInterval, FormatVideoEncoder formatVideoEncoder, + int avcProfile, int avcProfileLevel) { + this.width = width; + this.height = height; + this.fps = fps; + this.bitRate = bitRate; + this.rotation = rotation; + this.hardwareRotation = hardwareRotation; + this.formatVideoEncoder = formatVideoEncoder; + this.avcProfile = avcProfile; + this.avcProfileLevel = avcProfileLevel; + isBufferMode = true; + MediaCodecInfo encoder = chooseEncoder(type); + try { + if (encoder != null) { + codec = MediaCodec.createByCodecName(encoder.getName()); + if (this.formatVideoEncoder == FormatVideoEncoder.YUV420Dynamical) { + this.formatVideoEncoder = chooseColorDynamically(encoder); + if (this.formatVideoEncoder == null) { + Log.e(TAG, "YUV420 dynamical choose failed"); + return false; + } + } + } else { + Log.e(TAG, "Valid encoder not found"); + return false; + } + MediaFormat videoFormat; + //if you dont use mediacodec rotation you need swap width and height in rotation 90 or 270 + // for correct encoding resolution + String resolution; + //if (!hardwareRotation && (rotation == 90 || rotation == 270)) { + // resolution = height + "x" + width; + // videoFormat = MediaFormat.createVideoFormat(type, height, width); + //} else { + + resolution = width + "x" + height; + videoFormat = MediaFormat.createVideoFormat(type, width, height); + //} + Log.i(TAG, "Prepare video info: " + this.formatVideoEncoder.name() + ", " + resolution); + videoFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, + this.formatVideoEncoder.getFormatCodec()); + videoFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0); + videoFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate); + videoFormat.setInteger(MediaFormat.KEY_FRAME_RATE, fps); + videoFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval); + if (hardwareRotation) { + videoFormat.setInteger("rotation-degrees", rotation); + } + + if (this.avcProfile > 0 && this.avcProfileLevel > 0) { + // MediaFormat.KEY_PROFILE, API > 21 + videoFormat.setInteger("profile", this.avcProfile); + // MediaFormat.KEY_LEVEL, API > 23 + videoFormat.setInteger("level", this.avcProfileLevel); + } + codec.configure(videoFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); + running = false; + if (formatVideoEncoder == FormatVideoEncoder.SURFACE + && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + isBufferMode = false; + inputSurface = codec.createInputSurface(); + } + Log.i(TAG, "prepared"); + return true; + } catch (IOException | IllegalStateException e) { + Log.e(TAG, "Create VideoEncoder failed.", e); + return false; + } + } + + @Override + public void start(boolean resetTs) { + spsPpsSetted = false; + if (resetTs) { + presentTimeUs = System.nanoTime() / 1000; + fpsLimiter.setFPS(fps); + } + if (formatVideoEncoder != FormatVideoEncoder.SURFACE) { + YUVUtil.preAllocateBuffers(width * height * 3 / 2); + } + handlerThread = new HandlerThread(TAG); + handlerThread.start(); + Handler handler = new Handler(handlerThread.getLooper()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + createAsyncCallback(); + codec.setCallback(callback, handler); + codec.start(); + } else { + codec.start(); + handler.post(new Runnable() { + @Override + public void run() { + while (running) { + try { + getDataFromEncoder(null); + } catch (IllegalStateException e) { + Log.i(TAG, "Encoding error", e); + } + } + } + }); + } + running = true; + Log.i(TAG, "started"); + } + + @Override + protected void stopImp() { + if (handlerThread != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + handlerThread.quitSafely(); + } else { + handlerThread.quit(); + } + } + queue.clear(); + spsPpsSetted = false; + inputSurface = null; + Log.i(TAG, "stopped"); + } + + public void reset() { + stop(); + prepareVideoEncoder(width, height, fps, bitRate, rotation, hardwareRotation, iFrameInterval, + formatVideoEncoder, avcProfile, avcProfileLevel); + start(false); + } + + private FormatVideoEncoder chooseColorDynamically(MediaCodecInfo mediaCodecInfo) { + for (int color : mediaCodecInfo.getCapabilitiesForType(type).colorFormats) { + if (color == FormatVideoEncoder.YUV420PLANAR.getFormatCodec()) { + return FormatVideoEncoder.YUV420PLANAR; + } else if (color == FormatVideoEncoder.YUV420SEMIPLANAR.getFormatCodec()) { + return FormatVideoEncoder.YUV420SEMIPLANAR; + } + } + return null; + } + + /** + * Prepare encoder with default parameters + */ + public boolean prepareVideoEncoder() { + return prepareVideoEncoder(width, height, fps, bitRate, rotation, false, iFrameInterval, + formatVideoEncoder, avcProfile, avcProfileLevel); + } + + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + public void setVideoBitrateOnFly(int bitrate) { + if (isRunning()) { + this.bitRate = bitrate; + Bundle bundle = new Bundle(); + bundle.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, bitrate); + try { + codec.setParameters(bundle); + } catch (IllegalStateException e) { + Log.e(TAG, "encoder need be running", e); + } + } + } + + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + public void forceSyncFrame() { + if (isRunning()) { + Bundle bundle = new Bundle(); + bundle.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0); + try { + codec.setParameters(bundle); + } catch (IllegalStateException e) { + Log.e(TAG, "encoder need be running", e); + } + } + } + + public Surface getInputSurface() { + return inputSurface; + } + + public void setInputSurface(Surface inputSurface) { + this.inputSurface = inputSurface; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public boolean isHardwareRotation() { + return hardwareRotation; + } + + public int getRotation() { + return rotation; + } + + public void setFps(int fps) { + this.fps = fps; + } + + public int getFps() { + return fps; + } + + public int getBitRate() { + return bitRate; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @Override + public void inputYUVData(Frame frame) { + if (running && !queue.offer(frame)) { + Log.i(TAG, "frame discarded"); + } + } + + private void sendSPSandPPS(MediaFormat mediaFormat) { + //H265 + if (type.equals(CodecUtil.H265_MIME)) { + List byteBufferList = + extractVpsSpsPpsFromH265(mediaFormat.getByteBuffer("csd-0")); + getVideoData.onSpsPpsVps(byteBufferList.get(1), byteBufferList.get(2), byteBufferList.get(0)); + //H264 + } else { + getVideoData.onSpsPps(mediaFormat.getByteBuffer("csd-0"), mediaFormat.getByteBuffer("csd-1")); + } + } + + /** + * choose the video encoder by mime. + */ + @Override + protected MediaCodecInfo chooseEncoder(String mime) { + List mediaCodecInfoList; + if (force == CodecUtil.Force.HARDWARE) { + mediaCodecInfoList = CodecUtil.getAllHardwareEncoders(mime); + } else if (force == CodecUtil.Force.SOFTWARE) { + mediaCodecInfoList = CodecUtil.getAllSoftwareEncoders(mime); + } else { + mediaCodecInfoList = CodecUtil.getAllEncoders(mime); + } + for (MediaCodecInfo mci : mediaCodecInfoList) { + Log.i(TAG, String.format("VideoEncoder %s", mci.getName())); + MediaCodecInfo.CodecCapabilities codecCapabilities = mci.getCapabilitiesForType(mime); + for (int color : codecCapabilities.colorFormats) { + Log.i(TAG, "Color supported: " + color); + if (formatVideoEncoder == FormatVideoEncoder.SURFACE) { + if (color == FormatVideoEncoder.SURFACE.getFormatCodec()) return mci; + } else { + //check if encoder support any yuv420 color + if (color == FormatVideoEncoder.YUV420PLANAR.getFormatCodec() + || color == FormatVideoEncoder.YUV420SEMIPLANAR.getFormatCodec()) { + return mci; + } + } + } + } + return null; + } + + /** + * decode sps and pps if the encoder never call to MediaCodec.INFO_OUTPUT_FORMAT_CHANGED + */ + private Pair decodeSpsPpsFromBuffer(ByteBuffer outputBuffer, int length) { + byte[] mSPS = null, mPPS = null; + byte[] csd = new byte[length]; + outputBuffer.get(csd, 0, length); + int i = 0; + int spsIndex = -1; + int ppsIndex = -1; + while (i < length - 4) { + if (csd[i] == 0 && csd[i + 1] == 0 && csd[i + 2] == 0 && csd[i + 3] == 1) { + if (spsIndex == -1) { + spsIndex = i; + } else { + ppsIndex = i; + break; + } + } + i++; + } + if (spsIndex != -1 && ppsIndex != -1) { + mSPS = new byte[ppsIndex]; + System.arraycopy(csd, spsIndex, mSPS, 0, ppsIndex); + mPPS = new byte[length - ppsIndex]; + System.arraycopy(csd, ppsIndex, mPPS, 0, length - ppsIndex); + } + if (mSPS != null && mPPS != null) { + return new Pair<>(ByteBuffer.wrap(mSPS), ByteBuffer.wrap(mPPS)); + } + return null; + } + + /** + * You need find 0 0 0 1 byte sequence that is the initiation of vps, sps and pps + * buffers. + * + * @param csd0byteBuffer get in mediacodec case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED + * @return list with vps, sps and pps + */ + private List extractVpsSpsPpsFromH265(ByteBuffer csd0byteBuffer) { + List byteBufferList = new ArrayList<>(); + int vpsPosition = -1; + int spsPosition = -1; + int ppsPosition = -1; + int contBufferInitiation = 0; + byte[] csdArray = csd0byteBuffer.array(); + for (int i = 0; i < csdArray.length; i++) { + if (contBufferInitiation == 3 && csdArray[i] == 1) { + if (vpsPosition == -1) { + vpsPosition = i - 3; + } else if (spsPosition == -1) { + spsPosition = i - 3; + } else { + ppsPosition = i - 3; + } + } + if (csdArray[i] == 0) { + contBufferInitiation++; + } else { + contBufferInitiation = 0; + } + } + byte[] vps = new byte[spsPosition]; + byte[] sps = new byte[ppsPosition - spsPosition]; + byte[] pps = new byte[csdArray.length - ppsPosition]; + for (int i = 0; i < csdArray.length; i++) { + if (i < spsPosition) { + vps[i] = csdArray[i]; + } else if (i < ppsPosition) { + sps[i - spsPosition] = csdArray[i]; + } else { + pps[i - ppsPosition] = csdArray[i]; + } + } + byteBufferList.add(ByteBuffer.wrap(vps)); + byteBufferList.add(ByteBuffer.wrap(sps)); + byteBufferList.add(ByteBuffer.wrap(pps)); + return byteBufferList; + } + + @Override + protected Frame getInputFrame() throws InterruptedException { + Frame frame = queue.take(); + if (fpsLimiter.limitFPS()) return getInputFrame(); + byte[] buffer = frame.getBuffer(); + boolean isYV12 = frame.getFormat() == ImageFormat.YV12; + if (!hardwareRotation) { + int orientation = frame.isFlip() ? frame.getOrientation() + 180 : frame.getOrientation(); + if (orientation >= 360) orientation -= 360; + buffer = isYV12 ? YUVUtil.rotateYV12(buffer, width, height, orientation) + : YUVUtil.rotateNV21(buffer, width, height, orientation); + } + buffer = isYV12 ? YUVUtil.YV12toYUV420byColor(buffer, width, height, formatVideoEncoder) + : YUVUtil.NV21toYUV420byColor(buffer, width, height, formatVideoEncoder); + frame.setBuffer(buffer); + return frame; + } + + @Override + public void formatChanged(@NonNull MediaCodec mediaCodec, @NonNull MediaFormat mediaFormat) { + getVideoData.onVideoFormat(mediaFormat); + sendSPSandPPS(mediaFormat); + spsPpsSetted = true; + } + + @Override + protected void checkBuffer(@NonNull ByteBuffer byteBuffer, + @NonNull MediaCodec.BufferInfo bufferInfo) { + if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) { + if (!spsPpsSetted) { + Pair buffers = + decodeSpsPpsFromBuffer(byteBuffer.duplicate(), bufferInfo.size); + if (buffers != null) { + getVideoData.onSpsPps(buffers.first, buffers.second); + spsPpsSetted = true; + } + } + } + } + + @Override + protected void sendBuffer(@NonNull ByteBuffer byteBuffer, + @NonNull MediaCodec.BufferInfo bufferInfo) { + bufferInfo.presentationTimeUs = System.nanoTime() / 1000 - presentTimeUs; + getVideoData.getVideoData(byteBuffer, bufferInfo); + } + + private MediaCodec.Callback callback; + + @RequiresApi(api = Build.VERSION_CODES.M) + private void createAsyncCallback() { + callback = new MediaCodec.Callback() { + @Override + public void onInputBufferAvailable(@NonNull MediaCodec mediaCodec, int inBufferIndex) { + try { + inputAvailable(mediaCodec, inBufferIndex, null); + } catch (IllegalStateException e) { + Log.i(TAG, "Encoding error", e); + } + } + + @Override + public void onOutputBufferAvailable(@NonNull MediaCodec mediaCodec, int outBufferIndex, + @NonNull MediaCodec.BufferInfo bufferInfo) { + try { + outputAvailable(mediaCodec, outBufferIndex, bufferInfo); + } catch (IllegalStateException e) { + Log.i(TAG, "Encoding error", e); + } + } + + @Override + public void onError(@NonNull MediaCodec mediaCodec, @NonNull MediaCodec.CodecException e) { + Log.e(TAG, "Error", e); + } + + @Override + public void onOutputFormatChanged(@NonNull MediaCodec mediaCodec, + @NonNull MediaFormat mediaFormat) { + formatChanged(mediaCodec, mediaFormat); + } + }; + } +} \ No newline at end of file diff --git a/encoder/src/main/res/drawable/snow_flakes.png b/encoder/src/main/res/drawable/snow_flakes.png new file mode 100644 index 0000000..16593ca Binary files /dev/null and b/encoder/src/main/res/drawable/snow_flakes.png differ diff --git a/encoder/src/main/res/raw/analog_tv_fragment.glsl b/encoder/src/main/res/raw/analog_tv_fragment.glsl new file mode 100644 index 0000000..e2efa9f --- /dev/null +++ b/encoder/src/main/res/raw/analog_tv_fragment.glsl @@ -0,0 +1,44 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec2 uResolution; +uniform float uTime; + +varying vec2 vTextureCoord; + +float rand(vec2 co) { + return fract(sin(dot(co.xy , vec2(12.9898, 78.233))) * 43758.5453); +} + +void main() { + vec2 uv = vTextureCoord; + uv -= 0.5; + + // Take video pixel + vec3 col = texture2D(uSampler, (uv + 0.5)).rgb; + + // Glitch color + vec2 ruv = uv; + ruv.x += 0.02; + col.rgb += texture2D(uSampler, (ruv + 0.5)).rgb * 0.1; + + // Color noise + col += rand(fract(floor((ruv + uTime) * uResolution.y) * 0.7)) * 0.2; + + // Make small lines + col *= clamp(fract(uv.y * 100.0 + uTime * 8.0), 0.8, 1.0); + + // Make big lines + float bf = fract(uv.y * 3.0 + uTime * 26.0); + float ff = min(bf, 1.0 - bf) + 0.35; + col *= clamp(ff, 0.5, 0.75) + 0.75; + + // Make low Hz + col *= (sin(uTime * 120.0) * 0.5 + 0.5) * 0.1 + 0.9; + + // Make borders + col *= smoothstep(-0.51, -0.50, uv.x) * smoothstep(0.51, 0.50, uv.x); + col *= smoothstep(-0.51, -0.50, uv.y) * smoothstep(0.51, 0.50, uv.y); + + gl_FragColor = vec4(col, 1.0); +} diff --git a/encoder/src/main/res/raw/android_view_fragment.glsl b/encoder/src/main/res/raw/android_view_fragment.glsl new file mode 100644 index 0000000..4039e1d --- /dev/null +++ b/encoder/src/main/res/raw/android_view_fragment.glsl @@ -0,0 +1,14 @@ +#extension GL_OES_EGL_image_external : require +precision mediump float; + +uniform samplerExternalOES uSamplerView; +uniform sampler2D uSampler; + +varying vec2 vTextureCoord; + +void main() { + vec4 color = texture2D(uSampler, vTextureCoord); + vec4 viewColor = texture2D(uSamplerView, vec2(vTextureCoord.x, 1.0 - vTextureCoord.y)); + color.rgb *= 1.0 - viewColor.a; + gl_FragColor = color + viewColor; +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/basic_deformation_fragment.glsl b/encoder/src/main/res/raw/basic_deformation_fragment.glsl new file mode 100644 index 0000000..e809fb4 --- /dev/null +++ b/encoder/src/main/res/raw/basic_deformation_fragment.glsl @@ -0,0 +1,11 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uTime; + +varying vec2 vTextureCoord; + +void main() { + float waveu = sin((vTextureCoord.y + uTime) * 20.0) * 0.5 * 0.05 * 0.3; + gl_FragColor = texture2D(uSampler, vTextureCoord + vec2(waveu, 0)); +} diff --git a/encoder/src/main/res/raw/beauty_fragment.glsl b/encoder/src/main/res/raw/beauty_fragment.glsl new file mode 100644 index 0000000..c33e62e --- /dev/null +++ b/encoder/src/main/res/raw/beauty_fragment.glsl @@ -0,0 +1,109 @@ +precision highp float; + +uniform sampler2D uSampler; +uniform vec2 uResolution; + +varying vec2 vTextureCoord; + +const vec4 params = vec4(0.748, 0.874, 0.241, 0.241); +const vec3 W = vec3(0.299,0.587,0.114); +const mat3 saturateMatrix = mat3( + 1.1102,-0.0598,-0.061, + -0.0774,1.0826,-0.1186, + -0.0228,-0.0228,1.1772); + +vec2 blurCoordinates[24]; + +float hardLight(float color) { + if(color <= 0.5) { + color = color * color * 2.0; + } else { + color = 1.0 - ((1.0 - color)*(1.0 - color) * 2.0); + } + return color; +} + +void main() { + vec3 centralColor = texture2D(uSampler, vTextureCoord).rgb; + + blurCoordinates[0] = vTextureCoord.xy + uResolution * vec2(0.0, -10.0); + blurCoordinates[1] = vTextureCoord.xy + uResolution * vec2(0.0, 10.0); + blurCoordinates[2] = vTextureCoord.xy + uResolution * vec2(-10.0, 0.0); + blurCoordinates[3] = vTextureCoord.xy + uResolution * vec2(10.0, 0.0); + blurCoordinates[4] = vTextureCoord.xy + uResolution * vec2(5.0, -8.0); + blurCoordinates[5] = vTextureCoord.xy + uResolution * vec2(5.0, 8.0); + blurCoordinates[6] = vTextureCoord.xy + uResolution * vec2(-5.0, 8.0); + blurCoordinates[7] = vTextureCoord.xy + uResolution * vec2(-5.0, -8.0); + blurCoordinates[8] = vTextureCoord.xy + uResolution * vec2(8.0, -5.0); + blurCoordinates[9] = vTextureCoord.xy + uResolution * vec2(8.0, 5.0); + blurCoordinates[10] = vTextureCoord.xy + uResolution * vec2(-8.0, 5.0); + blurCoordinates[11] = vTextureCoord.xy + uResolution * vec2(-8.0, -5.0); + blurCoordinates[12] = vTextureCoord.xy + uResolution * vec2(0.0, -6.0); + blurCoordinates[13] = vTextureCoord.xy + uResolution * vec2(0.0, 6.0); + blurCoordinates[14] = vTextureCoord.xy + uResolution * vec2(6.0, 0.0); + blurCoordinates[15] = vTextureCoord.xy + uResolution * vec2(-6.0, 0.0); + blurCoordinates[16] = vTextureCoord.xy + uResolution * vec2(-4.0, -4.0); + blurCoordinates[17] = vTextureCoord.xy + uResolution * vec2(-4.0, 4.0); + blurCoordinates[18] = vTextureCoord.xy + uResolution * vec2(4.0, -4.0); + blurCoordinates[19] = vTextureCoord.xy + uResolution * vec2(4.0, 4.0); + blurCoordinates[20] = vTextureCoord.xy + uResolution * vec2(-2.0, -2.0); + blurCoordinates[21] = vTextureCoord.xy + uResolution * vec2(-2.0, 2.0); + blurCoordinates[22] = vTextureCoord.xy + uResolution * vec2(2.0, -2.0); + blurCoordinates[23] = vTextureCoord.xy + uResolution * vec2(2.0, 2.0); + + float sampleColor = centralColor.g * 22.0; + sampleColor += texture2D(uSampler, blurCoordinates[0]).g; + sampleColor += texture2D(uSampler, blurCoordinates[1]).g; + sampleColor += texture2D(uSampler, blurCoordinates[2]).g; + sampleColor += texture2D(uSampler, blurCoordinates[3]).g; + sampleColor += texture2D(uSampler, blurCoordinates[4]).g; + sampleColor += texture2D(uSampler, blurCoordinates[5]).g; + sampleColor += texture2D(uSampler, blurCoordinates[6]).g; + sampleColor += texture2D(uSampler, blurCoordinates[7]).g; + sampleColor += texture2D(uSampler, blurCoordinates[8]).g; + sampleColor += texture2D(uSampler, blurCoordinates[9]).g; + sampleColor += texture2D(uSampler, blurCoordinates[10]).g; + sampleColor += texture2D(uSampler, blurCoordinates[11]).g; + sampleColor += texture2D(uSampler, blurCoordinates[12]).g * 2.0; + sampleColor += texture2D(uSampler, blurCoordinates[13]).g * 2.0; + sampleColor += texture2D(uSampler, blurCoordinates[14]).g * 2.0; + sampleColor += texture2D(uSampler, blurCoordinates[15]).g * 2.0; + sampleColor += texture2D(uSampler, blurCoordinates[16]).g * 2.0; + sampleColor += texture2D(uSampler, blurCoordinates[17]).g * 2.0; + sampleColor += texture2D(uSampler, blurCoordinates[18]).g * 2.0; + sampleColor += texture2D(uSampler, blurCoordinates[19]).g * 2.0; + sampleColor += texture2D(uSampler, blurCoordinates[20]).g * 3.0; + sampleColor += texture2D(uSampler, blurCoordinates[21]).g * 3.0; + sampleColor += texture2D(uSampler, blurCoordinates[22]).g * 3.0; + sampleColor += texture2D(uSampler, blurCoordinates[23]).g * 3.0; + sampleColor = sampleColor / 62.0; + + float highPass = centralColor.g - sampleColor + 0.5; + + for(int i = 0; i < 5;i++) + { + highPass = hardLight(highPass); + } + float luminance = dot(centralColor, W); + float alpha = pow(luminance, params.r); + + vec3 smoothColor = centralColor + (centralColor-vec3(highPass))*alpha*0.1; + + smoothColor.r = clamp(pow(smoothColor.r, params.g),0.0,1.0); + smoothColor.g = clamp(pow(smoothColor.g, params.g),0.0,1.0); + smoothColor.b = clamp(pow(smoothColor.b, params.g),0.0,1.0); + + vec3 screen = vec3(1.0) - (vec3(1.0)-smoothColor) * (vec3(1.0)-centralColor); + vec3 lighten = max(smoothColor, centralColor); + vec3 softLight = 2.0 * centralColor*smoothColor + centralColor*centralColor + - 2.0 * centralColor*centralColor * smoothColor; + + gl_FragColor = vec4(mix(centralColor, screen, alpha), 1.0); + gl_FragColor.rgb = mix(gl_FragColor.rgb, lighten, alpha); + gl_FragColor.rgb = mix(gl_FragColor.rgb, softLight, params.b); + + vec3 satColor = gl_FragColor.rgb * saturateMatrix; + gl_FragColor.rgb = mix(gl_FragColor.rgb, satColor, params.a); + + gl_FragColor.rgb = vec3(gl_FragColor.rgb + vec3(-0.096)); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/black_fragment.glsl b/encoder/src/main/res/raw/black_fragment.glsl new file mode 100644 index 0000000..2c001da --- /dev/null +++ b/encoder/src/main/res/raw/black_fragment.glsl @@ -0,0 +1,11 @@ +precision mediump float; + +uniform sampler2D uSampler; + +varying vec2 vTextureCoord; + +void main() { + vec4 pixel = texture2D(uSampler, vTextureCoord); + //Ignore color and set black color. I think this is not the best way + gl_FragColor = vec4(0.0, 0.0, 0.0, pixel.a); +} diff --git a/encoder/src/main/res/raw/blur_fragment.glsl b/encoder/src/main/res/raw/blur_fragment.glsl new file mode 100644 index 0000000..d07b66b --- /dev/null +++ b/encoder/src/main/res/raw/blur_fragment.glsl @@ -0,0 +1,21 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uBlur; +uniform float uRadius; + +varying vec2 vTextureCoord; + +void main() { + vec3 sum = vec3(0); + if (uBlur > 0.0) { + for (float i = -uBlur; i < uBlur; i++) { + for (float j = -uBlur; j < uBlur; j++) { + sum += texture2D(uSampler, vTextureCoord + vec2(i, j) * (uRadius / uBlur)).rgb / pow(uBlur * 2.0, 2.0); + } + } + } else { + sum = texture2D(uSampler, vTextureCoord).rgb; + } + gl_FragColor = vec4(sum, 1.0); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/brightness_fragment.glsl b/encoder/src/main/res/raw/brightness_fragment.glsl new file mode 100644 index 0000000..3676ff6 --- /dev/null +++ b/encoder/src/main/res/raw/brightness_fragment.glsl @@ -0,0 +1,11 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uBrightness; + +varying vec2 vTextureCoord; + +void main() { + vec4 pixel = texture2D(uSampler, vTextureCoord); + gl_FragColor = vec4(pixel.rgb + vec3(uBrightness), pixel.a); +} diff --git a/encoder/src/main/res/raw/camera_fragment.glsl b/encoder/src/main/res/raw/camera_fragment.glsl new file mode 100644 index 0000000..5c17092 --- /dev/null +++ b/encoder/src/main/res/raw/camera_fragment.glsl @@ -0,0 +1,9 @@ +#extension GL_OES_EGL_image_external : require +precision mediump float; + +uniform samplerExternalOES sCamera; +varying vec2 vTextureCoord; + +void main() { + gl_FragColor = texture2D(sCamera, vTextureCoord); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/cartoon_fragment.glsl b/encoder/src/main/res/raw/cartoon_fragment.glsl new file mode 100644 index 0000000..85b9ee3 --- /dev/null +++ b/encoder/src/main/res/raw/cartoon_fragment.glsl @@ -0,0 +1,35 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uCartoon; + +varying vec2 vTextureCoord; + +#define PI 3.1415927 + +void main(){ + vec3 t = texture2D(uSampler, vTextureCoord).rgb; + vec3 t00 = texture2D(uSampler, vTextureCoord + vec2(-uCartoon, -uCartoon)).rgb; + vec3 t10 = texture2D(uSampler, vTextureCoord + vec2(uCartoon, -uCartoon)).rgb; + vec3 t01 = texture2D(uSampler, vTextureCoord + vec2(-uCartoon, uCartoon)).rgb; + vec3 t11 = texture2D(uSampler, vTextureCoord + vec2(uCartoon, uCartoon)).rgb; + vec3 tm = (t00 + t01 + t10 + t11) / 4.0; + t = t - tm; + t = t * t * t; + vec3 v = 10000.0 * t; + float g = (tm.x - 0.3) * 5.0; + vec3 col0 = vec3(0.0, 0.0, 0.0); + vec3 col1 = vec3(0.2, 0.5, 1.0); + vec3 col2 = vec3(1.0, 0.8, 0.7); + vec3 col3 = vec3(1.0, 1.0, 1.0); + vec3 c; + if (g > 2.0) c = mix(col2, col3, g - 2.0); + else if (g > 1.0) c = mix(col1, col2, g - 1.0); + else c = mix(col0, col1, g); + c = clamp(c, 0.0, 1.0); + v = clamp(v, 0.0, 1.0); + v = c * (1.0 - v); + v = clamp(v, 0.0, 1.0); + if (v == col0) v = col3; + gl_FragColor = vec4(v, 1.0); +} diff --git a/encoder/src/main/res/raw/circle_fragment.glsl b/encoder/src/main/res/raw/circle_fragment.glsl new file mode 100644 index 0000000..55dd144 --- /dev/null +++ b/encoder/src/main/res/raw/circle_fragment.glsl @@ -0,0 +1,25 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uRadius; +uniform vec2 uCenter; +uniform vec2 uResolution; + +varying vec2 vTextureCoord; + +void main() { + vec2 uv; + vec2 center; + if (uResolution.x < uResolution.y) { + float scale = uResolution.y / uResolution.x; + uv = vec2(vTextureCoord.x, vTextureCoord.y * scale); + center = vec2(uCenter.x, uCenter.y * scale); + } else { + float scale = uResolution.x / uResolution.y; + uv = vec2(vTextureCoord.x * scale, vTextureCoord.y); + center = vec2(uCenter.x * scale, uCenter.y); + } + + float distance = length(uv - center); + if (distance < uRadius) gl_FragColor = texture2D(uSampler, vTextureCoord); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/color_fragment.glsl b/encoder/src/main/res/raw/color_fragment.glsl new file mode 100644 index 0000000..b061d9e --- /dev/null +++ b/encoder/src/main/res/raw/color_fragment.glsl @@ -0,0 +1,13 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec3 uColor; + +varying vec2 vTextureCoord; +const vec3 luma = vec3(0.299, 0.587, 0.114); + +void main() { + vec4 pixel = texture2D(uSampler, vTextureCoord); + float grey = dot(pixel.rgb, luma); + gl_FragColor = vec4(grey * uColor, pixel.a); +} diff --git a/encoder/src/main/res/raw/contrast_fragment.glsl b/encoder/src/main/res/raw/contrast_fragment.glsl new file mode 100644 index 0000000..f890632 --- /dev/null +++ b/encoder/src/main/res/raw/contrast_fragment.glsl @@ -0,0 +1,11 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uContrast; + +varying vec2 vTextureCoord; + +void main() { + vec4 pixel = texture2D(uSampler, vTextureCoord); + gl_FragColor = vec4((pixel.rgb - vec3(0.5)) * uContrast + vec3(0.5), pixel.a); +} diff --git a/encoder/src/main/res/raw/duotone_fragment.glsl b/encoder/src/main/res/raw/duotone_fragment.glsl new file mode 100644 index 0000000..592c603 --- /dev/null +++ b/encoder/src/main/res/raw/duotone_fragment.glsl @@ -0,0 +1,14 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec3 uColor; +uniform vec3 uColor2; + +varying vec2 vTextureCoord; +const vec3 luma = vec3(0.299, 0.587, 0.114); + +void main() { + vec4 pixel = texture2D(uSampler, vTextureCoord); + float grey = dot(pixel.rgb, luma); + gl_FragColor = vec4((1.0 - grey) * uColor + grey * uColor2, pixel.a); +} diff --git a/encoder/src/main/res/raw/earlybird_fragment.glsl b/encoder/src/main/res/raw/earlybird_fragment.glsl new file mode 100644 index 0000000..20737b3 --- /dev/null +++ b/encoder/src/main/res/raw/earlybird_fragment.glsl @@ -0,0 +1,50 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec2 uResolution; + +varying vec2 vTextureCoord; + +mat3 saturationMatrix(float saturation) { + vec3 luminance = vec3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + vec3 red = vec3(luminance.x * oneMinusSat); + red.r += saturation; + + vec3 green = vec3(luminance.y * oneMinusSat); + green.g += saturation; + + vec3 blue = vec3(luminance.z * oneMinusSat); + blue.b += saturation; + + return mat3(red, green, blue); +} + +void levels(inout vec3 col, in vec3 inleft, in vec3 inright, in vec3 outleft, in vec3 outright) { + col = clamp(col, inleft, inright); + col = (col - inleft) / (inright - inleft); + col = outleft + col * (outright - outleft); +} + +void main() { + vec3 col = texture2D(uSampler, vTextureCoord).rgb; + vec2 fragCoord = vTextureCoord * uResolution; + vec2 coord = (fragCoord + fragCoord - uResolution) / uResolution.y; + vec3 gradient = vec3(pow(1.0 - length(coord * 0.4), 0.6) * 1.2); + vec3 grey = vec3(184.0 / 255.0); + vec3 tint = vec3(252.0, 243.0, 213.0) / 255.0; + col = saturationMatrix(0.68) * col; + levels(col, vec3(0.0), vec3(1.0), vec3(27.0, 0.0, 0.0) / 255.0, vec3(255.0) / 255.0); + col = pow(col, vec3(1.19)); + //brightnessAdjust + col += 0.13; + //contrastAdjust + float t = 0.5 - 1.05 * 0.5; + col = col * 1.05 + t; + + col = saturationMatrix(0.85) * col; + levels(col, vec3(0.0), vec3(235.0 / 255.0), vec3(0.0, 0.0, 0.0) / 255.0, vec3(255.0) / 255.0); + col = mix(tint * col, col, gradient); + col = 1.0 - (1.0 - col) / grey; //colorBurn + gl_FragColor = vec4(col, 1.0); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/edge_detection_fragment.glsl b/encoder/src/main/res/raw/edge_detection_fragment.glsl new file mode 100644 index 0000000..5f742d2 --- /dev/null +++ b/encoder/src/main/res/raw/edge_detection_fragment.glsl @@ -0,0 +1,12 @@ +#extension GL_OES_standard_derivatives : enable +precision mediump float; + +uniform sampler2D uSampler; + +varying vec2 vTextureCoord; + +void main() { + vec4 color = texture2D(uSampler, vTextureCoord); + float gray = length(color.rgb); + gl_FragColor = vec4(vec3(step(0.06, length(vec2(dFdx(gray), dFdy(gray))))), 1.0); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/exposure_fragment.glsl b/encoder/src/main/res/raw/exposure_fragment.glsl new file mode 100644 index 0000000..a598b22 --- /dev/null +++ b/encoder/src/main/res/raw/exposure_fragment.glsl @@ -0,0 +1,11 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uExposure; + +varying vec2 vTextureCoord; + +void main() { + vec4 pixel = texture2D(uSampler, vTextureCoord); + gl_FragColor = vec4(pixel.rgb * pow(2.0, uExposure), pixel.a); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/fire_fragment.glsl b/encoder/src/main/res/raw/fire_fragment.glsl new file mode 100644 index 0000000..f477696 --- /dev/null +++ b/encoder/src/main/res/raw/fire_fragment.glsl @@ -0,0 +1,21 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec2 uResolution; + +varying vec2 vTextureCoord; + +vec2 texel_size = vec2(6.0, 6.0); + +void main() { + vec2 fragCoord = vTextureCoord * uResolution; + fragCoord = floor(fragCoord / texel_size); // Pixelify + fragCoord /= uResolution / texel_size; // Correct scale + float reaction_coordinate = texture2D(uSampler, fragCoord).r; // Use red channel + float mixval = ((reaction_coordinate - 0.55) * 10.0 + 0.5) * 2.0; + gl_FragColor = vec4(mix(vec3(1.0, 0.58, 0.0), vec3(1.0, 0.7, 0.4), mixval), reaction_coordinate); + gl_FragColor.rgb = vec3(1.0, 0.2, 0.0); // Red + if (gl_FragColor.a > 0.65) gl_FragColor.rgb = vec3(1.0, 1.0, 1.0); // White + else if (gl_FragColor.a > 0.37) gl_FragColor.rgb = vec3(1.4, 0.8, 0.0); // Yellow + gl_FragColor.a = float(gl_FragColor.a > 0.1); +} diff --git a/encoder/src/main/res/raw/fxaa.glsl b/encoder/src/main/res/raw/fxaa.glsl new file mode 100644 index 0000000..c38d7c1 --- /dev/null +++ b/encoder/src/main/res/raw/fxaa.glsl @@ -0,0 +1,77 @@ +/* +* http://www.geeks3d.com/20110405/fxaa-fast-approximate-anti-aliasing-demo-glsl-opengl-test-radeon-geforce/3/ +*/ +precision highp float; + +#define FXAA_SPAN_MAX 8.0 +#define FXAA_REDUCE_MUL (1.0 / 8.0) +#define FXAA_REDUCE_MIN (1.0 / 256.0) + +uniform sampler2D uSampler; +uniform vec2 uResolution; +uniform float uAAEnabled; + +varying vec2 vTextureCoord; + +vec4 FxaaTexOff(sampler2D tex, vec2 p, vec2 o, vec2 r){ + return texture2D(tex, p + (o * r)); +} +/** + * + * @param posPos {@link vec4} Output of FxaaVertexShader interpolated across screen. + * @param tex {@link sampler2D} The input texture. + * @param rcpFrame {@link vec2} Constant {1.0/frameWidth, 1.0/frameHeight}. + */ +vec3 FxaaPixelShader(sampler2D tex, vec2 uv, vec2 pos, vec2 rcpFrame) { +/*---------------------------------------------------------*/ + vec3 rgbNW = texture2D(tex, pos).xyz; + vec3 rgbNE = FxaaTexOff(tex, pos, vec2(1,0), rcpFrame).xyz; + vec3 rgbSW = FxaaTexOff(tex, pos, vec2(0,1), rcpFrame).xyz; + vec3 rgbSE = FxaaTexOff(tex, pos, vec2(1,1), rcpFrame).xyz; + vec3 rgbM = texture2D(tex, uv).xyz; +/*---------------------------------------------------------*/ + vec3 luma = vec3(0.299, 0.587, 0.114); + float lumaNW = dot(rgbNW, luma); + float lumaNE = dot(rgbNE, luma); + float lumaSW = dot(rgbSW, luma); + float lumaSE = dot(rgbSE, luma); + float lumaM = dot(rgbM, luma); +/*---------------------------------------------------------*/ + float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); + float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); +/*---------------------------------------------------------*/ + vec2 dir; + dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); + dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE)); +/*---------------------------------------------------------*/ + float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN); + float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce); + dir = min(vec2( FXAA_SPAN_MAX, FXAA_SPAN_MAX), + max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), + dir * rcpDirMin)) * rcpFrame.xy; +/*--------------------------------------------------------*/ + vec3 rgbA = (1.0 / 2.0) * ( + texture2D(tex, uv + dir * (1.0 / 3.0 - 0.5)).xyz + + texture2D(tex, uv + dir * (2.0 / 3.0 - 0.5)).xyz); + vec3 rgbB = rgbA * (1.0 / 2.0) + (1.0 / 4.0) * ( + texture2D(tex, uv + dir * (0.0 / 3.0 - 0.5)).xyz + + texture2D(tex, uv + dir * (3.0 / 3.0 - 0.5)).xyz); + float lumaB = dot(rgbB, luma); + if((lumaB < lumaMin) || (lumaB > lumaMax)) { + return rgbA; + } + return rgbB; +} + +vec4 PostFX(sampler2D tex, vec2 uv) { + vec2 rcpFrame = vec2(1.0 / uResolution.x, 1.0 / uResolution.y); + vec4 c = vec4(0.0); + vec2 pos = uv - (rcpFrame * (0.5 + FXAA_REDUCE_MUL)); + c.rgb = FxaaPixelShader(tex, uv, pos, rcpFrame); + c.a = 1.0; + return c; +} + +void main() { + gl_FragColor = uAAEnabled == 1.0 ? PostFX(uSampler, vTextureCoord) : texture2D(uSampler, vTextureCoord); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/fxaa_pc.glsl b/encoder/src/main/res/raw/fxaa_pc.glsl new file mode 100644 index 0000000..e92817d --- /dev/null +++ b/encoder/src/main/res/raw/fxaa_pc.glsl @@ -0,0 +1,94 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec2 uResolution; +uniform float uAAEnabled; + +varying vec2 vTextureCoord; + +vec4 FxaaTexTop(vec2 pos) { + vec4 color; + color.rgb = texture2D(uSampler, pos).rgb; + color.a = dot(color.rgb, vec3(0.299, 0.587, 0.114)); + return color; +} + +/* PC console FXAA implementation */ +vec4 FxaaPixelShader(vec2 pos, vec4 fxaaConsolePosPos, vec2 fxaaConsoleRcpFrameOpt, + vec2 fxaaConsoleRcpFrameOpt2, float fxaaConsoleEdgeSharpness, float fxaaConsoleEdgeThreshold, + float fxaaConsoleEdgeThresholdMin) { + + float lumaNw = FxaaTexTop(fxaaConsolePosPos.xy).a; + float lumaSw = FxaaTexTop(fxaaConsolePosPos.xw).a; + float lumaNe = FxaaTexTop(fxaaConsolePosPos.zy).a; + float lumaSe = FxaaTexTop(fxaaConsolePosPos.zw).a; + + vec4 rgbyM = FxaaTexTop(pos.xy); + float lumaM = rgbyM.w; + + float lumaMaxNwSw = max(lumaNw, lumaSw); + lumaNe += 1.0/384.0; + float lumaMinNwSw = min(lumaNw, lumaSw); + + float lumaMaxNeSe = max(lumaNe, lumaSe); + float lumaMinNeSe = min(lumaNe, lumaSe); + + float lumaMax = max(lumaMaxNeSe, lumaMaxNwSw); + float lumaMin = min(lumaMinNeSe, lumaMinNwSw); + + float lumaMaxScaled = lumaMax * fxaaConsoleEdgeThreshold; + + float lumaMinM = min(lumaMin, lumaM); + float lumaMaxScaledClamped = max(fxaaConsoleEdgeThresholdMin, lumaMaxScaled); + float lumaMaxM = max(lumaMax, lumaM); + float dirSwMinusNe = lumaSw - lumaNe; + float lumaMaxSubMinM = lumaMaxM - lumaMinM; + float dirSeMinusNw = lumaSe - lumaNw; + + if (lumaMaxSubMinM < lumaMaxScaledClamped) + return rgbyM; + + vec2 dir; + dir.x = dirSwMinusNe + dirSeMinusNw; + dir.y = dirSwMinusNe - dirSeMinusNw; + + vec2 dir1 = normalize(dir.xy); + vec4 rgbyN1 = FxaaTexTop(pos.xy - dir1 * fxaaConsoleRcpFrameOpt); + vec4 rgbyP1 = FxaaTexTop(pos.xy + dir1 * fxaaConsoleRcpFrameOpt); + + float dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * fxaaConsoleEdgeSharpness; + vec2 dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0); + + vec4 rgbyN2 = FxaaTexTop(pos.xy - dir2 * fxaaConsoleRcpFrameOpt2); + vec4 rgbyP2 = FxaaTexTop(pos.xy + dir2 * fxaaConsoleRcpFrameOpt2); + + vec4 rgbyA = rgbyN1 + rgbyP1; + vec4 rgbyB = ((rgbyN2 + rgbyP2) * 0.25) + (rgbyA * 0.25); + + bool twoTap = (rgbyB.w < lumaMin) || (rgbyB.w > lumaMax); + if (twoTap) + rgbyB.xyz = rgbyA.xyz * 0.5; + + return rgbyB; +} + +void main() { + if (uAAEnabled == 1.0) { + vec2 uFxaaConsoleRcpFrameOpt = vec2(0.5 / uResolution.x, 0.5 / uResolution.y); + vec2 uFxaaConsoleRcpFrameOpt2 = vec2(2.0 / uResolution.x, 2.0 / uResolution.y); + vec4 uFrameSize = vec4(uResolution.x, uResolution.y, 1.0 / uResolution.x, 1.0 / uResolution.y); + + vec4 fxaaConsolePosPos; + fxaaConsolePosPos.xy = vTextureCoord * uFrameSize.xy - 1.0; + fxaaConsolePosPos.zw = fxaaConsolePosPos.xy + 2.0; + fxaaConsolePosPos *= uFrameSize.zwzw; + + const float fxaaConsoleEdgeSharpness = 8.0; + const float fxaaConsoleEdgeThreshold = 0.125; + const float fxaaConsoleEdgeThresholdMin = 0.0625; + gl_FragColor = FxaaPixelShader(vTextureCoord, fxaaConsolePosPos, uFxaaConsoleRcpFrameOpt, + uFxaaConsoleRcpFrameOpt2, fxaaConsoleEdgeSharpness, fxaaConsoleEdgeThreshold, fxaaConsoleEdgeThresholdMin); + } else { + gl_FragColor = texture2D(uSampler, vTextureCoord); + } +} diff --git a/encoder/src/main/res/raw/gamma_fragment.glsl b/encoder/src/main/res/raw/gamma_fragment.glsl new file mode 100644 index 0000000..08fc072 --- /dev/null +++ b/encoder/src/main/res/raw/gamma_fragment.glsl @@ -0,0 +1,11 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uGamma; + +varying vec2 vTextureCoord; + +void main() { + vec4 pixel = texture2D(uSampler, vTextureCoord); + gl_FragColor = vec4(pow(pixel.rgb, vec3(uGamma)), pixel.a); +} diff --git a/encoder/src/main/res/raw/glitch_fragment.glsl b/encoder/src/main/res/raw/glitch_fragment.glsl new file mode 100644 index 0000000..e2e46aa --- /dev/null +++ b/encoder/src/main/res/raw/glitch_fragment.glsl @@ -0,0 +1,90 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uTime; + +varying vec2 vTextureCoord; + +vec3 mod289(vec3 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec2 mod289(vec2 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec3 permute(vec3 x) { + return mod289(((x * 34.0) + 1.0) * x); +} + +float snoise(vec2 v) { + const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0 + 0.366025403784439, // 0.5*(sqrt(3.0)-1.0) + -0.577350269189626, // -1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 +// First corner + vec2 i = floor(v + dot(v, C.yy) ); + vec2 x0 = v - i + dot(i, C.xx); + +// Other corners + vec2 i1; + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + vec4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + +// Permutations + i = mod289(i); // Avoid truncation effects in permutation + vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0)) + + i.x + vec3(0.0, i1.x, 1.0)); + + vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m; + m = m * m; + +// Gradients: 41 points uniformly over a line, mapped onto a diamond. +// The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + vec3 x = 2.0 * fract(p * C.www) - 1.0; + vec3 h = abs(x) - 0.5; + vec3 ox = floor(x + 0.5); + vec3 a0 = x - ox; + +// Normalise gradients implicitly by scaling m +// Approximation of: m *= inversesqrt( a0*a0 + h*h ); + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + +// Compute final noise value at P + vec3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); +} + +float rand(vec2 co) { + return fract(sin(dot(co.xy,vec2(12.9898,78.233))) * 43758.5453); +} + +void main() { + float time = uTime * 2.0; + // Create large, incidental noise waves + float noise = max(0.0, snoise(vec2(time, vTextureCoord.y * 0.3)) - 0.3) * (1.0 / 0.7); + // Offset by smaller, constant noise waves + noise = noise + (snoise(vec2(time * 10.0, vTextureCoord.y * 2.4)) - 0.5) * 0.15; + // Apply the noise as x displacement for every line + float xpos = vTextureCoord.x - noise * noise * 0.25; + gl_FragColor = texture2D(uSampler, vec2(xpos, vTextureCoord.y)); + // Mix in some random interference for lines + gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(rand(vec2(vTextureCoord.y * time))), noise * 0.3).rgb; + // Apply a line pattern every 4 pixels + if (floor(mod(gl_FragColor.y * 0.25, 2.0)) == 0.0) { + gl_FragColor.rgb *= 1.0 - (0.15 * noise); + } + // Shift green/blue channels (using the red channel) + gl_FragColor.g = mix(gl_FragColor.r, texture2D(uSampler, vec2(xpos + noise * 0.05, vTextureCoord.y)).g, 0.25); + gl_FragColor.b = mix(gl_FragColor.r, texture2D(uSampler, vec2(xpos - noise * 0.05, vTextureCoord.y)).b, 0.25); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/grey_scale_fragment.glsl b/encoder/src/main/res/raw/grey_scale_fragment.glsl new file mode 100644 index 0000000..5e7284b --- /dev/null +++ b/encoder/src/main/res/raw/grey_scale_fragment.glsl @@ -0,0 +1,12 @@ +precision mediump float; + +uniform sampler2D uSampler; + +varying vec2 vTextureCoord; +const vec3 luma = vec3(0.299, 0.587, 0.114); + +void main() { + vec4 pixel = texture2D(uSampler, vTextureCoord); + float grey = dot(pixel.rgb, luma); + gl_FragColor = vec4(grey, grey, grey, pixel.a); +} diff --git a/encoder/src/main/res/raw/halftone_lines_fragment.glsl b/encoder/src/main/res/raw/halftone_lines_fragment.glsl new file mode 100644 index 0000000..c0bd85b --- /dev/null +++ b/encoder/src/main/res/raw/halftone_lines_fragment.glsl @@ -0,0 +1,84 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec2 uResolution; +uniform float uMode; +uniform float uRows; +uniform float uRotation; +uniform float uAntialias; +uniform vec2 uSampleDist; + +varying vec2 vTextureCoord; + +float rgbToGray(vec4 rgba) { + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + return dot(rgba.xyz, W); +} + +float avgerageGray(vec2 uv, float stepX, float stepY) { + // get samples around pixel + vec4 colors[9]; + colors[0] = texture2D(uSampler,uv + vec2(-stepX, stepY)); + colors[1] = texture2D(uSampler,uv + vec2(0, stepY)); + colors[2] = texture2D(uSampler,uv + vec2(stepX, stepY)); + colors[3] = texture2D(uSampler,uv + vec2(-stepX, 0)); + colors[4] = texture2D(uSampler,uv); + colors[5] = texture2D(uSampler,uv + vec2(stepX, 0)); + colors[6] = texture2D(uSampler,uv + vec2(-stepX, -stepY)); + colors[7] = texture2D(uSampler,uv + vec2(0, -stepY)); + colors[8] = texture2D(uSampler,uv + vec2(stepX, -stepY)); + // sum + return averaged gray + vec4 result = vec4(0); + for (int i = 0; i < 9; i++) { + result += colors[i]; + } + return rgbToGray(result) / 9.0; +} + +vec2 rotateCoord(vec2 uv, float rads) { + uv *= mat2(cos(rads), sin(rads), -sin(rads), cos(rads)); + return uv; +} + +void main() { + // halftone line coords + vec2 uvRow = fract(rotateCoord(vTextureCoord, uRotation) * uRows); + vec2 uvFloorY = vec2(vTextureCoord.x, floor(vTextureCoord.y * uRows) / uRows) + vec2(0., (1.0 / uRows) * 0.5); // add y offset to get center row color + // get averaged gray for row + float averagedBW = avgerageGray(uvFloorY, uSampleDist.x/uResolution.x, uSampleDist.y/uResolution.y); + // use averaged gray to set line thickness + vec3 finalColor = vec3(1.); + if(uMode == 1.) { + if(uvRow.y > averagedBW) finalColor = vec3(0.0); + } else if(uMode == 2.) { + if(distance(uvRow.y + 0.5, averagedBW * 2.) < 0.2) finalColor = vec3(0.0); + } else if(uMode == 3.) { + float distFromRowCenter = 1.0 - distance(uvRow.y, 0.5) * 2.0; + finalColor = vec3(1.0 - smoothstep(averagedBW - uAntialias, averagedBW + uAntialias, distFromRowCenter)); + } else if(uMode == 4.) { + vec2 uvRow2 = fract(rotateCoord(vTextureCoord, -uRotation) * uRows); + float distFromRowCenter1 = 1.0 - distance(uvRow.y, 0.5) * 2.0; + float distFromRowCenter2 = 1.0 - distance(uvRow2.y, 0.5) * 2.0; + float distFromRowCenter = min(distFromRowCenter1, distFromRowCenter2); + finalColor = vec3(1.0 - smoothstep(averagedBW - uAntialias, averagedBW + uAntialias, distFromRowCenter)); + } else if(uMode == 5.) { + vec2 uvRow2 = fract(rotateCoord(vTextureCoord, -uRotation) * uRows); + float distFromRowCenter1 = 1.0 - distance(uvRow.y, 0.5) * 2.0; + float distFromRowCenter2 = 1.0 - distance(uvRow2.y, 0.5) * 2.0; + float distFromRowCenter = mix(distFromRowCenter1, distFromRowCenter2, 0.5); + finalColor = vec3(1.0 - smoothstep(averagedBW - uAntialias, averagedBW + uAntialias, distFromRowCenter)); + } else if(uMode == 6.) { + float rot = floor(averagedBW * 6.28) / 6.28; + rot = rot * 4.; + vec2 uvRow = fract(rotateCoord(vTextureCoord, rot) * uRows); + float distFromRowCenter = 1.0 - distance(uvRow.y, 0.5) * 2.0; + finalColor = vec3(1.0 - smoothstep(averagedBW - uAntialias, averagedBW + uAntialias, distFromRowCenter)); + } else if(uMode == 7.) { + vec4 originalColor = texture2D(uSampler, uvFloorY); + float distFromRowCenter = 1.0 - distance(uvRow.y, 0.5) * 2.0; + float mixValue = 1.0 - smoothstep(averagedBW - uAntialias, averagedBW + uAntialias, distFromRowCenter); + finalColor = mix(originalColor.rgb, vec3(1.), mixValue); + } + // draw + gl_FragColor = vec4(finalColor, 1.0); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/image70s_fragment.glsl b/encoder/src/main/res/raw/image70s_fragment.glsl new file mode 100644 index 0000000..43ee1d8 --- /dev/null +++ b/encoder/src/main/res/raw/image70s_fragment.glsl @@ -0,0 +1,14 @@ +precision mediump float; + +uniform sampler2D uSampler; + +varying vec2 vTextureCoord; + +void main() { + vec4 texColor = texture2D(uSampler, vTextureCoord); + float avg = (texColor.r + texColor.g + texColor.b) / 3.0; // grayscale + texColor.r *= abs(cos(avg)); + texColor.g *= abs(sin(avg)); + texColor.b *= abs(atan(avg) * sin(avg)); + gl_FragColor = texColor; +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/lamoish_fragment.glsl b/encoder/src/main/res/raw/lamoish_fragment.glsl new file mode 100644 index 0000000..2dc35dc --- /dev/null +++ b/encoder/src/main/res/raw/lamoish_fragment.glsl @@ -0,0 +1,23 @@ +precision mediump float; + +uniform sampler2D uSampler; + +varying vec2 vTextureCoord; + +void main() { + vec4 color = texture2D(uSampler, vTextureCoord); + vec3 ncolor = vec3(0.0, 0.0, 0.0); + float value; + if (color.r < 0.5) value = color.r; + else value = 1.0 - color.r; + float red = 4.0 * value * value * value; + if (color.r < 0.5) ncolor.r = red; + else ncolor.r = 1.0 - red; + if (color.g < 0.5) value = color.g; + else value = 1.0 - color.g; + float green = 2.0 * value * value; + if (color.g < 0.5) ncolor.g = green; + else ncolor.g = 1.0 - green; + ncolor.b = color.b * 0.5 + 0.25; + gl_FragColor = vec4(ncolor.rgb, color.a); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/money_fragment.glsl b/encoder/src/main/res/raw/money_fragment.glsl new file mode 100644 index 0000000..1776557 --- /dev/null +++ b/encoder/src/main/res/raw/money_fragment.glsl @@ -0,0 +1,44 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec2 uResolution; + +varying vec2 vTextureCoord; + +const int kNumPatrones = 6; + +void main() { + vec2 texCoord = vTextureCoord * uResolution.xy; + vec2 xy = texCoord.xy / uResolution.yy; + float amplitud = 0.03; + float frecuencia = 10.0; + float gris = 1.0; + float divisor = 8.0 / uResolution.y; + float grosorInicial = divisor * 0.2; + // x: seno del angulo, y: coseno del angulo, z: factor de suavizado + vec3 datosPatron[kNumPatrones]; + datosPatron[0] = vec3(-0.7071, 0.7071, 3.0); // -45 + datosPatron[1] = vec3(0.0, 1.0, 0.6); // 0 + datosPatron[2] = vec3(0.0, 1.0, 0.5); // 0 + datosPatron[3] = vec3(1.0, 0.0, 0.4); // 90 + datosPatron[4] = vec3(1.0, 0.0, 0.3); // 90 + datosPatron[5] = vec3(0.0, 1.0, 0.2); // 0 + vec4 color = texture2D(uSampler, vec2(texCoord.x / uResolution.x, xy.y)); + gl_FragColor = color; + for(int i = 0; i < kNumPatrones; i++) { + float coseno = datosPatron[i].x; + float seno = datosPatron[i].y; + vec2 punto = vec2(xy.x * coseno - xy.y * seno, xy.x * seno + xy.y * coseno); + float grosor = grosorInicial * float(i + 1); + float dist = mod(punto.y + grosor * 0.5 - sin(punto.x * frecuencia) * amplitud, divisor); + float brillo = 0.3 * color.r + 0.4 * color.g + 0.3 * color.b; + if(dist < grosor && brillo < 0.75 - 0.12 * float(i)) { + // Suavizado + float k = datosPatron[i].z; + float x = (grosor - dist) / grosor; + float fx = abs((x - 0.5) / k) - (0.5 - k) / k; + gris = min(fx, gris); + } + } + gl_FragColor = vec4(gris, gris, gris, 1.0); +} diff --git a/encoder/src/main/res/raw/negative_fragment.glsl b/encoder/src/main/res/raw/negative_fragment.glsl new file mode 100644 index 0000000..907d13d --- /dev/null +++ b/encoder/src/main/res/raw/negative_fragment.glsl @@ -0,0 +1,10 @@ +precision mediump float; + +uniform sampler2D uSampler; + +varying vec2 vTextureCoord; + +void main() { + vec3 negative = 1.0 - texture2D(uSampler, vTextureCoord).rgb; + gl_FragColor = vec4(negative, 1.0); +} diff --git a/encoder/src/main/res/raw/object_fragment.glsl b/encoder/src/main/res/raw/object_fragment.glsl new file mode 100644 index 0000000..224c1cd --- /dev/null +++ b/encoder/src/main/res/raw/object_fragment.glsl @@ -0,0 +1,19 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform sampler2D uObject; +uniform float uAlpha; + +varying vec2 vTextureCoord; +varying vec2 vTextureObjectCoord; + +void main() { + vec4 samplerPixel = texture2D(uSampler, vTextureCoord); + vec4 objectPixel = texture2D(uObject, vTextureObjectCoord); + if (vTextureObjectCoord.x < 0.0 || vTextureObjectCoord.x > 1.0 || + vTextureObjectCoord.y < 0.0 || vTextureObjectCoord.y > 1.0) { + gl_FragColor = samplerPixel; + } else { + gl_FragColor = mix(samplerPixel, objectPixel, objectPixel.a * uAlpha); + } +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/object_vertex.glsl b/encoder/src/main/res/raw/object_vertex.glsl new file mode 100644 index 0000000..cf572f7 --- /dev/null +++ b/encoder/src/main/res/raw/object_vertex.glsl @@ -0,0 +1,15 @@ +attribute vec4 aPosition; +attribute vec4 aTextureCoord; +attribute vec4 aTextureObjectCoord; + +uniform mat4 uMVPMatrix; +uniform mat4 uSTMatrix; + +varying vec2 vTextureCoord; +varying vec2 vTextureObjectCoord; + +void main() { + gl_Position = uMVPMatrix * aPosition; + vTextureCoord = (uSTMatrix * aTextureCoord).xy; + vTextureObjectCoord = (uSTMatrix * aTextureObjectCoord).xy; +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/pixelated_fragment.glsl b/encoder/src/main/res/raw/pixelated_fragment.glsl new file mode 100644 index 0000000..4e1eb27 --- /dev/null +++ b/encoder/src/main/res/raw/pixelated_fragment.glsl @@ -0,0 +1,11 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uPixelated; + +varying vec2 vTextureCoord; + +void main() { + vec2 coord = vec2(uPixelated * floor(vTextureCoord.x / uPixelated), uPixelated * floor(vTextureCoord.y / uPixelated)); + gl_FragColor = texture2D(uSampler, coord); +} diff --git a/encoder/src/main/res/raw/polygonization_fragment.glsl b/encoder/src/main/res/raw/polygonization_fragment.glsl new file mode 100644 index 0000000..36b7af3 --- /dev/null +++ b/encoder/src/main/res/raw/polygonization_fragment.glsl @@ -0,0 +1,52 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec2 uResolution; + +varying vec2 vTextureCoord; + +vec2 hash2(vec2 p) { + return fract(sin(vec2(dot(p, vec2(127.1, 311.7)),dot(p, vec2(269.5, 183.3)))) * 43758.5453); +} + +vec2 voronoi(in vec2 x) { + vec2 n = floor(x); + vec2 f = fract(x); + //---------------------------------- + // regular voronoi + //---------------------------------- + vec2 mg, mr; + float md = 8.0; + for(int j = -1; j <= 1; j++) + for(int i = -1; i <= 1; i++) { + vec2 g = vec2(float(i), float(j)); + vec2 o = hash2(n + g); + vec2 r = g + o - f; + float d = dot(r, r); + if(d < md) { + md = d; + mr = r; + mg = g; + } + } + return mr; +} + +vec3 VoronoiColor(float steps, vec2 p, vec2 uv) { + vec2 c = voronoi(steps * p); + vec2 uv1 = uv; + uv1.x += c.x / steps; + uv1.y += c.y / steps * uResolution.x / uResolution.y; + return texture2D(uSampler, vec2(uv1.x, uv1.y)).xyz; +} + +void main() { + vec2 p = (vTextureCoord * uResolution).xy / uResolution.xx; + vec2 uv = (vTextureCoord * uResolution).xy / uResolution.xy; + vec3 color = vec3(0.0, 0.0, 0.0); + for (float i = 0.0; i < 4.0; i += 1.0) { + float steps = 30.0 * pow(2.0, i); + color += VoronoiColor(steps, p, uv); + } + gl_FragColor = vec4(color * 0.25, 1.0); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/rainbow_fragment.glsl b/encoder/src/main/res/raw/rainbow_fragment.glsl new file mode 100644 index 0000000..a12fd0c --- /dev/null +++ b/encoder/src/main/res/raw/rainbow_fragment.glsl @@ -0,0 +1,40 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uTime; + +varying vec2 vTextureCoord; + +#define posterSteps 4.0 +#define lumaMult 0.5 +#define timeMult 0.15 +#define BW 0 + +float rgbToGray(vec4 rgba) { + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + return dot(rgba.xyz, W); +} + +vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +void main() { + vec4 color = texture2D(uSampler, vTextureCoord); + float luma = rgbToGray(color) * lumaMult; + float lumaIndex = floor(luma * posterSteps); + float lumaFloor = lumaIndex / posterSteps; + float lumaRemainder = (luma - lumaFloor) * posterSteps; + if(mod(lumaIndex, 2.) == 0.) lumaRemainder = 1.0 - lumaRemainder; // flip luma remainder for smooth color transitions + float lumaCycle = mod(luma + uTime * timeMult, 1.); + vec3 roygbiv = hsv2rgb(vec3(lumaCycle, 1., lumaRemainder)); + if(BW == 1) { + float bw = rgbToGray(vec4(roygbiv, 1.)); + gl_FragColor = vec4(vec3(bw), 1.0); + } else { + gl_FragColor = vec4(roygbiv, 1.0); + } +} + diff --git a/encoder/src/main/res/raw/rgb_saturation_fragment.glsl b/encoder/src/main/res/raw/rgb_saturation_fragment.glsl new file mode 100644 index 0000000..fcfb5fa --- /dev/null +++ b/encoder/src/main/res/raw/rgb_saturation_fragment.glsl @@ -0,0 +1,11 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec3 uRGBSaturation; + +varying vec2 vTextureCoord; + +void main() { + vec4 pixel = texture2D(uSampler, vTextureCoord); + gl_FragColor = vec4(pixel.r * uRGBSaturation.r, pixel.g * uRGBSaturation.g, pixel.b * uRGBSaturation.b, 1.0); +} diff --git a/encoder/src/main/res/raw/ripple_fragment.glsl b/encoder/src/main/res/raw/ripple_fragment.glsl new file mode 100644 index 0000000..c549b0d --- /dev/null +++ b/encoder/src/main/res/raw/ripple_fragment.glsl @@ -0,0 +1,17 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec2 uResolution; +uniform float uSpeed; +uniform float uTime; + +varying vec2 vTextureCoord; + +void main() { + vec2 cPos = -1.0 + 2.0 * vTextureCoord; + float ratio = uResolution.x / uResolution.y; + cPos.x *= ratio; + float cLength = length(cPos); + vec2 uv = vTextureCoord + (cPos / cLength) * cos(cLength * uSpeed - uTime * uSpeed) * 0.03; + gl_FragColor = texture2D(uSampler, uv); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/saturation_fragment.glsl b/encoder/src/main/res/raw/saturation_fragment.glsl new file mode 100644 index 0000000..fde0f69 --- /dev/null +++ b/encoder/src/main/res/raw/saturation_fragment.glsl @@ -0,0 +1,23 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uShift; +uniform vec3 uWeights; +uniform vec3 uExponents; +uniform float uSaturation; + +varying vec2 vTextureCoord; + +void main() { + vec4 oldcolor = texture2D(uSampler, vTextureCoord); + float kv = dot(oldcolor.rgb, uWeights) + uShift; + vec3 new_color = uSaturation * oldcolor.rgb + (1.0 - uSaturation) * kv; + gl_FragColor= vec4(new_color, oldcolor.a); + + vec4 color = texture2D(uSampler, vTextureCoord); + float de = dot(color.rgb, uWeights); + float inv_de = 1.0 / de; + vec3 verynew_color = de * pow(color.rgb * inv_de, uExponents); + float max_color = max(max(max(verynew_color.r, verynew_color.g), verynew_color.b), 1.0); + gl_FragColor = gl_FragColor + vec4(verynew_color / max_color, color.a); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/sepia_fragment.glsl b/encoder/src/main/res/raw/sepia_fragment.glsl new file mode 100644 index 0000000..4dc71fa --- /dev/null +++ b/encoder/src/main/res/raw/sepia_fragment.glsl @@ -0,0 +1,14 @@ +precision mediump float; + +uniform sampler2D uSampler; + +varying vec2 vTextureCoord; + +void main() { + vec4 pixel = texture2D(uSampler, vTextureCoord); + vec4 sepia = vec4(clamp(pixel.x * 0.393 + pixel.y * 0.769 + pixel.z * 0.189, 0.0, 1.0), + clamp(pixel.x * 0.349 + pixel.y * 0.686 + pixel.z * 0.168, 0.0, 1.0), + clamp(pixel.x * 0.272 + pixel.y * 0.534 + pixel.z * 0.131, 0.0, 1.0), + pixel.w); + gl_FragColor = sepia; +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/sharpness_fragment.glsl b/encoder/src/main/res/raw/sharpness_fragment.glsl new file mode 100644 index 0000000..c39dfd6 --- /dev/null +++ b/encoder/src/main/res/raw/sharpness_fragment.glsl @@ -0,0 +1,31 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform vec2 uStepSize; +uniform float uSharpness; + +varying vec2 vTextureCoord; + +void main() { + vec3 nbr_color = vec3(0.0, 0.0, 0.0); + vec2 coord; + vec4 color = texture2D(uSampler, vTextureCoord); + + coord.x = vTextureCoord.x - 0.5 * uStepSize.x; + coord.y = vTextureCoord.y - uStepSize.y; + nbr_color += texture2D(uSampler, coord).rgb - color.rgb; + + coord.x = vTextureCoord.x - uStepSize.x; + coord.y = vTextureCoord.y + 0.5 * uStepSize.y; + nbr_color += texture2D(uSampler, coord).rgb - color.rgb; + + coord.x = vTextureCoord.x + uStepSize.x; + coord.y = vTextureCoord.y - 0.5 * uStepSize.y; + nbr_color += texture2D(uSampler, coord).rgb - color.rgb; + + coord.x = vTextureCoord.x + uStepSize.x; + coord.y = vTextureCoord.y + 0.5 * uStepSize.y; + nbr_color += texture2D(uSampler, coord).rgb - color.rgb; + + gl_FragColor = vec4(color.rgb - 2.0 * uSharpness * nbr_color, color.a); +} diff --git a/encoder/src/main/res/raw/simple_fragment.glsl b/encoder/src/main/res/raw/simple_fragment.glsl new file mode 100644 index 0000000..6ad4190 --- /dev/null +++ b/encoder/src/main/res/raw/simple_fragment.glsl @@ -0,0 +1,9 @@ +precision mediump float; + +uniform sampler2D uSampler; + +varying vec2 vTextureCoord; + +void main() { + gl_FragColor = texture2D(uSampler, vTextureCoord); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/simple_vertex.glsl b/encoder/src/main/res/raw/simple_vertex.glsl new file mode 100644 index 0000000..42defee --- /dev/null +++ b/encoder/src/main/res/raw/simple_vertex.glsl @@ -0,0 +1,12 @@ +attribute vec4 aPosition; +attribute vec4 aTextureCoord; + +uniform mat4 uMVPMatrix; +uniform mat4 uSTMatrix; + +varying vec2 vTextureCoord; + +void main() { + gl_Position = uMVPMatrix * aPosition; + vTextureCoord = (uSTMatrix * aTextureCoord).xy; +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/snow_fragment.glsl b/encoder/src/main/res/raw/snow_fragment.glsl new file mode 100644 index 0000000..241daa0 --- /dev/null +++ b/encoder/src/main/res/raw/snow_fragment.glsl @@ -0,0 +1,47 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform sampler2D uSnow; +uniform float uTime; + +varying vec2 vTextureCoord; + +/* + Returns a texel of snowflake. +*/ +vec4 getSnow(vec2 pos) { + // Get a texel of the noise image. + vec3 texel; + if (pos.x < 0.0 || pos.x > 1.0 || pos.y < 0.0 || pos.y > 1.0) { + texel = vec3(0.0, 0.0, 0.0); + } else { + texel = texture2D(uSnow, pos).rgb; + } + // Only use extremely bright values. + texel = smoothstep(0.6, 1.0, texel); + // Okay how can this give a transparent rgba value? + return vec4(texel, 1.0); +} + +/* + Provides a 2D vector with which to warp the sampling location + of the snow_flakes texture. +*/ +vec2 warpSpeed(float time, float gravity, vec2 pos) { + // Do some things to stretch out the timescale based on 2D position and actual time. + return vec2(-time * 5.55 + sin(pos.x * 10.0 * sin(time * 0.2)) * 0.4, + time * gravity + sin(pos.y * 10.0 * sin(time * 0.4)) * 0.4); +} + +vec4 getSnowField(vec2 pos) { + // Just some not-so-magic inversely related values. + // That's all they are. + return getSnow(pos - 0.75 + uTime * 0.25) + + getSnow(pos - 0.5 + uTime * 0.25) + + getSnow(pos - 0.25 + uTime * 0.25) + + getSnow(pos - 0.0 + uTime * 0.25); +} + +void main() { + gl_FragColor = max(texture2D(uSampler, vTextureCoord), getSnowField(vTextureCoord)); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/surface_fragment.glsl b/encoder/src/main/res/raw/surface_fragment.glsl new file mode 100644 index 0000000..8104ab8 --- /dev/null +++ b/encoder/src/main/res/raw/surface_fragment.glsl @@ -0,0 +1,20 @@ +#extension GL_OES_EGL_image_external : require +precision mediump float; + +uniform samplerExternalOES uSamplerSurface; +uniform sampler2D uSampler; +uniform float uAlpha; + +varying vec2 vTextureCoord; +varying vec2 vTextureObjectCoord; + +void main() { + vec4 color = texture2D(uSampler, vTextureCoord); + vec4 surfaceColor = texture2D(uSamplerSurface, vTextureObjectCoord); + if (vTextureObjectCoord.x < 0.0 || vTextureObjectCoord.x > 1.0 || + vTextureObjectCoord.y < 0.0 || vTextureObjectCoord.y > 1.0) { + gl_FragColor = color; + } else { + gl_FragColor = mix(color, surfaceColor, surfaceColor.a * uAlpha); + } +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/swirl_fragment.glsl b/encoder/src/main/res/raw/swirl_fragment.glsl new file mode 100644 index 0000000..92f9fbd --- /dev/null +++ b/encoder/src/main/res/raw/swirl_fragment.glsl @@ -0,0 +1,22 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uTime; +uniform vec2 uResolution; +uniform float uRadius; +uniform vec2 uCenter; + +varying vec2 vTextureCoord; + +#define PI 3.14159 + +void main() { + float effectRadius = 0.2; + float effectAngle = 2.0 * PI * uTime; + vec2 uv = vTextureCoord - uCenter; + float len = length(uv * vec2(uResolution.x / uResolution.y, 1.0)); + float angle = atan(uv.y, uv.x) + effectAngle * smoothstep(uRadius, 0.0, len); + float radius = length(uv); + + gl_FragColor = texture2D(uSampler, vec2(radius * cos(angle), radius * sin(angle)) + uCenter); +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/temperature_fragment.glsl b/encoder/src/main/res/raw/temperature_fragment.glsl new file mode 100644 index 0000000..8699480 --- /dev/null +++ b/encoder/src/main/res/raw/temperature_fragment.glsl @@ -0,0 +1,16 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uTemperature; + +varying vec2 vTextureCoord; + +void main() { + vec4 pixel = texture2D(uSampler, vTextureCoord); + pixel.r = pixel.r + pixel.r * (1.0 - pixel.r) * uTemperature; + pixel.b = pixel.b - pixel.b * (1.0 - pixel.b) * uTemperature; + if (uTemperature > 0.0) pixel.g = pixel.g + pixel.g * (1.0 - pixel.g) * uTemperature * 0.25; + float value = max(pixel.r, max(pixel.g, pixel.b)); + if (value > 1.0) pixel.rgb /= value; + gl_FragColor = pixel; +} \ No newline at end of file diff --git a/encoder/src/main/res/raw/zebra_fragment.glsl b/encoder/src/main/res/raw/zebra_fragment.glsl new file mode 100644 index 0000000..a8bcc17 --- /dev/null +++ b/encoder/src/main/res/raw/zebra_fragment.glsl @@ -0,0 +1,17 @@ +precision mediump float; + +uniform sampler2D uSampler; +uniform float uTime; +uniform float uLevels; + +varying vec2 vTextureCoord; + +void main() { + float phase = uTime * 0.5; + vec4 tx = texture2D(uSampler, vTextureCoord); + vec4 x = tx; + x = mod(x + phase, 1.0); + x = floor(x * uLevels); + x = mod(x, 2.0); + gl_FragColor= vec4(vec3(x), tx.a); +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..4d15d01 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..f6b961f Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..d7577eb --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Feb 19 17:29:52 CET 2021 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/hs_err_pid98176.log b/hs_err_pid98176.log new file mode 100644 index 0000000..4ce8fbe --- /dev/null +++ b/hs_err_pid98176.log @@ -0,0 +1,827 @@ +# +# There is insufficient memory for the Java Runtime Environment to continue. +# Native memory allocation (malloc) failed to allocate 1408496 bytes for Chunk::new +# Possible reasons: +# The system is out of physical RAM or swap space +# The process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap +# Possible solutions: +# Reduce memory load on the system +# Increase physical memory or swap space +# Check if swap backing store is full +# Decrease Java heap size (-Xmx/-Xms) +# Decrease number of Java threads +# Decrease Java thread stack sizes (-Xss) +# Set larger code cache with -XX:ReservedCodeCacheSize= +# JVM is running with Zero Based Compressed Oops mode in which the Java heap is +# placed in the first 32GB address space. The Java Heap base address is the +# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress +# to set the Java Heap base and to place the Java Heap above 32GB virtual address. +# This output file may be truncated or incomplete. +# +# Out of Memory Error (./src/hotspot/share/memory/arena.cpp:197), pid=98176, tid=99644 +# +# JRE version: OpenJDK Runtime Environment (11.0.8+10) (build 11.0.8+10-b944.6842174) +# Java VM: OpenJDK 64-Bit Server VM (11.0.8+10-b944.6842174, mixed mode, tiered, compressed oops, g1 gc, windows-amd64) +# No core dump will be written. Minidumps are not enabled by default on client versions of Windows +# + +--------------- S U M M A R Y ------------ + +Command Line: org.jetbrains.kotlin.cli.jvm.K2JVMCompiler @C:\Users\Schoumi\projet\peeriscope\app\build\20210505_14483671906268588073.compiler.options + +Host: Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz, 4 cores, 23G, Windows 10 , 64 bit Build 19041 (10.0.19041.928) +Time: Wed May 5 15:50:23 2021 Paris, Madrid (heure d’été) elapsed time: 7 seconds (0d 0h 0m 7s) + +--------------- T H R E A D --------------- + +Current thread (0x000002a64cb02800): JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=99644, stack(0x000000f557600000,0x000000f557700000)] + + +Current CompileTask: +C2: 7728 6411 4 org.jetbrains.kotlin.parsing.KotlinExpressionParsing::parseBinaryExpression (70 bytes) + +Stack: [0x000000f557600000,0x000000f557700000] +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +V [jvm.dll+0x5de50a] +V [jvm.dll+0x7122f5] +V [jvm.dll+0x71384d] +V [jvm.dll+0x713f03] +V [jvm.dll+0x23e728] +V [jvm.dll+0xb899c] +V [jvm.dll+0xb8e9c] +V [jvm.dll+0x35020b] +V [jvm.dll+0x193cbc] +V [jvm.dll+0x1f780e] +V [jvm.dll+0x1f68d4] +V [jvm.dll+0x17f32c] +V [jvm.dll+0x205047] +V [jvm.dll+0x203891] +V [jvm.dll+0x6dad3f] +V [jvm.dll+0x6d3895] +V [jvm.dll+0x5dd4a6] +C [ucrtbase.dll+0x21bb2] +C [KERNEL32.DLL+0x17034] +C [ntdll.dll+0x52651] + + +--------------- P R O C E S S --------------- + +Threads class SMR info: +_java_thread_list=0x000002a64e15bb50, length=11, elements={ +0x000002a628769800, 0x000002a64caac800, 0x000002a64cad0800, 0x000002a64caff000, +0x000002a64cb00000, 0x000002a64cb02800, 0x000002a64cb06000, 0x000002a64cb58000, +0x000002a64cca5800, 0x000002a64ccac000, 0x000002a64ccfe800 +} + +Java Threads: ( => current thread ) + 0x000002a628769800 JavaThread "main" [_thread_in_vm, id=98084, stack(0x000000f556b00000,0x000000f556c00000)] + 0x000002a64caac800 JavaThread "Reference Handler" daemon [_thread_blocked, id=96524, stack(0x000000f557200000,0x000000f557300000)] + 0x000002a64cad0800 JavaThread "Finalizer" daemon [_thread_blocked, id=55944, stack(0x000000f557300000,0x000000f557400000)] + 0x000002a64caff000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=99560, stack(0x000000f557400000,0x000000f557500000)] + 0x000002a64cb00000 JavaThread "Attach Listener" daemon [_thread_blocked, id=98208, stack(0x000000f557500000,0x000000f557600000)] +=>0x000002a64cb02800 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=99644, stack(0x000000f557600000,0x000000f557700000)] + 0x000002a64cb06000 JavaThread "C1 CompilerThread0" daemon [_thread_in_native, id=6428, stack(0x000000f557700000,0x000000f557800000)] + 0x000002a64cb58000 JavaThread "Sweeper thread" daemon [_thread_blocked, id=14276, stack(0x000000f557800000,0x000000f557900000)] + 0x000002a64cca5800 JavaThread "Service Thread" daemon [_thread_blocked, id=99552, stack(0x000000f557900000,0x000000f557a00000)] + 0x000002a64ccac000 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=98284, stack(0x000000f557b00000,0x000000f557c00000)] + 0x000002a64ccfe800 JavaThread "C2 CompilerThread1" daemon [_thread_in_native, id=99024, stack(0x000000f557c00000,0x000000f557d00000)] + +Other Threads: + 0x000002a64caaa000 VMThread "VM Thread" [stack: 0x000000f557100000,0x000000f557200000] [id=12952] + 0x000002a64cca7800 WatcherThread [stack: 0x000000f557a00000,0x000000f557b00000] [id=96484] + 0x000002a628782800 GCTaskThread "GC Thread#0" [stack: 0x000000f556c00000,0x000000f556d00000] [id=97136] + 0x000002a64d434000 GCTaskThread "GC Thread#1" [stack: 0x000000f557d00000,0x000000f557e00000] [id=52864] + 0x000002a64d442000 GCTaskThread "GC Thread#2" [stack: 0x000000f557e00000,0x000000f557f00000] [id=98608] + 0x000002a64d4a0800 GCTaskThread "GC Thread#3" [stack: 0x000000f557f00000,0x000000f558000000] [id=100088] + 0x000002a628808800 ConcurrentGCThread "G1 Main Marker" [stack: 0x000000f556d00000,0x000000f556e00000] [id=99248] + 0x000002a62880a000 ConcurrentGCThread "G1 Conc#0" [stack: 0x000000f556e00000,0x000000f556f00000] [id=97996] + 0x000002a64c10b800 ConcurrentGCThread "G1 Refine#0" [stack: 0x000000f556f00000,0x000000f557000000] [id=96984] + 0x000002a64df58800 ConcurrentGCThread "G1 Refine#1" [stack: 0x000000f558000000,0x000000f558100000] [id=99460] + 0x000002a64c10c800 ConcurrentGCThread "G1 Young RemSet Sampling" [stack: 0x000000f557000000,0x000000f557100000] [id=99264] + +Threads with active compile tasks: +C2 CompilerThread0 7751 6411 4 org.jetbrains.kotlin.parsing.KotlinExpressionParsing::parseBinaryExpression (70 bytes) +C1 CompilerThread0 7751 6553 2 org.jetbrains.kotlin.parsing.KotlinParsing::parseProperty (564 bytes) +C2 CompilerThread1 7751 6423 4 org.jetbrains.kotlin.com.intellij.psi.impl.source.CharTableImpl::intern (71 bytes) + +VM state:not at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event]) +[0x000002a6287652b0] Compile_lock - owner thread: 0x000002a64cb06000 +[0x000002a628764ad0] MethodCompileQueue_lock - owner thread: 0x000002a64cb06000 + +Heap address: 0x0000000681200000, size: 6126 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 +Narrow klass base: 0x0000000800000000, Narrow klass shift: 0 +Compressed class space size: 1073741824 Address: 0x0000000800000000 + +Heap: + garbage-first heap total 393216K, used 159163K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 132 young (135168K), 8 survivors (8192K) + Metaspace used 57757K, capacity 58447K, committed 58652K, reserved 1101824K + class space used 6654K, capacity 6923K, committed 6988K, reserved 1048576K +Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, A=archive, TAMS=top-at-mark-start (previous, next) +| 0|0x0000000681200000, 0x0000000681300000, 0x0000000681300000|100%|HS| |TAMS 0x0000000681300000, 0x0000000681200000| Complete +| 1|0x0000000681300000, 0x0000000681400000, 0x0000000681400000|100%|HC| |TAMS 0x0000000681400000, 0x0000000681300000| Complete +| 2|0x0000000681400000, 0x0000000681500000, 0x0000000681500000|100%|HC| |TAMS 0x0000000681500000, 0x0000000681400000| Complete +| 3|0x0000000681500000, 0x0000000681600000, 0x0000000681600000|100%|HS| |TAMS 0x0000000681600000, 0x0000000681500000| Complete +| 4|0x0000000681600000, 0x0000000681700000, 0x0000000681700000|100%|HC| |TAMS 0x0000000681700000, 0x0000000681600000| Complete +| 5|0x0000000681700000, 0x0000000681800000, 0x0000000681800000|100%|HC| |TAMS 0x0000000681800000, 0x0000000681700000| Complete +| 6|0x0000000681800000, 0x0000000681900000, 0x0000000681900000|100%|HS| |TAMS 0x0000000681900000, 0x0000000681800000| Complete +| 7|0x0000000681900000, 0x0000000681a00000, 0x0000000681a00000|100%|HC| |TAMS 0x0000000681a00000, 0x0000000681900000| Complete +| 8|0x0000000681a00000, 0x0000000681b00000, 0x0000000681b00000|100%|HC| |TAMS 0x0000000681b00000, 0x0000000681a00000| Complete +| 9|0x0000000681b00000, 0x0000000681c00000, 0x0000000681c00000|100%| O| |TAMS 0x0000000681c00000, 0x0000000681b00000| Untracked +| 10|0x0000000681c00000, 0x0000000681d00000, 0x0000000681d00000|100%| O| |TAMS 0x0000000681d00000, 0x0000000681c00000| Untracked +| 11|0x0000000681d00000, 0x0000000681e00000, 0x0000000681e00000|100%| O| |TAMS 0x0000000681e00000, 0x0000000681d00000| Untracked +| 12|0x0000000681e00000, 0x0000000681f00000, 0x0000000681f00000|100%| O| |TAMS 0x0000000681f00000, 0x0000000681e00000| Untracked +| 13|0x0000000681f00000, 0x0000000682000000, 0x0000000682000000|100%|HS| |TAMS 0x0000000681f00000, 0x0000000681f00000| Complete +| 14|0x0000000682000000, 0x0000000682100000, 0x0000000682100000|100%|HC| |TAMS 0x0000000682000000, 0x0000000682000000| Complete +| 15|0x0000000682100000, 0x0000000682200000, 0x0000000682200000|100%| O| |TAMS 0x0000000682200000, 0x0000000682100000| Untracked +| 16|0x0000000682200000, 0x0000000682300000, 0x0000000682300000|100%| O| |TAMS 0x0000000682300000, 0x0000000682200000| Untracked +| 17|0x0000000682300000, 0x0000000682400000, 0x0000000682400000|100%| O| |TAMS 0x0000000682400000, 0x0000000682300000| Untracked +| 18|0x0000000682400000, 0x0000000682500000, 0x0000000682500000|100%| O| |TAMS 0x0000000682500000, 0x0000000682400000| Untracked +| 19|0x0000000682500000, 0x0000000682600000, 0x0000000682600000|100%| O| |TAMS 0x0000000682600000, 0x0000000682500000| Untracked +| 20|0x0000000682600000, 0x0000000682700000, 0x0000000682700000|100%| O| |TAMS 0x0000000682700000, 0x0000000682600000| Untracked +| 21|0x0000000682700000, 0x0000000682800000, 0x0000000682800000|100%| O| |TAMS 0x0000000682800000, 0x0000000682700000| Untracked +| 22|0x0000000682800000, 0x0000000682900000, 0x0000000682900000|100%| O| |TAMS 0x0000000682900000, 0x0000000682800000| Untracked +| 23|0x0000000682900000, 0x000000068296ee00, 0x0000000682a00000| 43%| O| |TAMS 0x0000000682900000, 0x0000000682900000| Untracked +| 24|0x0000000682a00000, 0x0000000682b00000, 0x0000000682b00000|100%|HS| |TAMS 0x0000000682a00000, 0x0000000682a00000| Complete +| 25|0x0000000682b00000, 0x0000000682b00000, 0x0000000682c00000| 0%| F| |TAMS 0x0000000682b00000, 0x0000000682b00000| Untracked +| 26|0x0000000682c00000, 0x0000000682c00000, 0x0000000682d00000| 0%| F| |TAMS 0x0000000682c00000, 0x0000000682c00000| Untracked +| 27|0x0000000682d00000, 0x0000000682d00000, 0x0000000682e00000| 0%| F| |TAMS 0x0000000682d00000, 0x0000000682d00000| Untracked +| 28|0x0000000682e00000, 0x0000000682e00000, 0x0000000682f00000| 0%| F| |TAMS 0x0000000682e00000, 0x0000000682e00000| Untracked +| 29|0x0000000682f00000, 0x0000000682f00000, 0x0000000683000000| 0%| F| |TAMS 0x0000000682f00000, 0x0000000682f00000| Untracked +| 30|0x0000000683000000, 0x0000000683000000, 0x0000000683100000| 0%| F| |TAMS 0x0000000683000000, 0x0000000683000000| Untracked +| 31|0x0000000683100000, 0x0000000683100000, 0x0000000683200000| 0%| F| |TAMS 0x0000000683100000, 0x0000000683100000| Untracked +| 32|0x0000000683200000, 0x0000000683200000, 0x0000000683300000| 0%| F| |TAMS 0x0000000683200000, 0x0000000683200000| Untracked +| 33|0x0000000683300000, 0x0000000683300000, 0x0000000683400000| 0%| F| |TAMS 0x0000000683300000, 0x0000000683300000| Untracked +| 34|0x0000000683400000, 0x0000000683400000, 0x0000000683500000| 0%| F| |TAMS 0x0000000683400000, 0x0000000683400000| Untracked +| 35|0x0000000683500000, 0x0000000683500000, 0x0000000683600000| 0%| F| |TAMS 0x0000000683500000, 0x0000000683500000| Untracked +| 36|0x0000000683600000, 0x0000000683600000, 0x0000000683700000| 0%| F| |TAMS 0x0000000683600000, 0x0000000683600000| Untracked +| 37|0x0000000683700000, 0x0000000683700000, 0x0000000683800000| 0%| F| |TAMS 0x0000000683700000, 0x0000000683700000| Untracked +| 38|0x0000000683800000, 0x0000000683800000, 0x0000000683900000| 0%| F| |TAMS 0x0000000683800000, 0x0000000683800000| Untracked +| 39|0x0000000683900000, 0x0000000683900000, 0x0000000683a00000| 0%| F| |TAMS 0x0000000683900000, 0x0000000683900000| Untracked +| 40|0x0000000683a00000, 0x0000000683a00000, 0x0000000683b00000| 0%| F| |TAMS 0x0000000683a00000, 0x0000000683a00000| Untracked +| 41|0x0000000683b00000, 0x0000000683b00000, 0x0000000683c00000| 0%| F| |TAMS 0x0000000683b00000, 0x0000000683b00000| Untracked +| 42|0x0000000683c00000, 0x0000000683c00000, 0x0000000683d00000| 0%| F| |TAMS 0x0000000683c00000, 0x0000000683c00000| Untracked +| 43|0x0000000683d00000, 0x0000000683d00000, 0x0000000683e00000| 0%| F| |TAMS 0x0000000683d00000, 0x0000000683d00000| Untracked +| 44|0x0000000683e00000, 0x0000000683e00000, 0x0000000683f00000| 0%| F| |TAMS 0x0000000683e00000, 0x0000000683e00000| Untracked +| 45|0x0000000683f00000, 0x0000000683f00000, 0x0000000684000000| 0%| F| |TAMS 0x0000000683f00000, 0x0000000683f00000| Untracked +| 46|0x0000000684000000, 0x0000000684000000, 0x0000000684100000| 0%| F| |TAMS 0x0000000684000000, 0x0000000684000000| Untracked +| 47|0x0000000684100000, 0x0000000684100000, 0x0000000684200000| 0%| F| |TAMS 0x0000000684100000, 0x0000000684100000| Untracked +| 48|0x0000000684200000, 0x0000000684200000, 0x0000000684300000| 0%| F| |TAMS 0x0000000684200000, 0x0000000684200000| Untracked +| 49|0x0000000684300000, 0x0000000684300000, 0x0000000684400000| 0%| F| |TAMS 0x0000000684300000, 0x0000000684300000| Untracked +| 50|0x0000000684400000, 0x0000000684400000, 0x0000000684500000| 0%| F| |TAMS 0x0000000684400000, 0x0000000684400000| Untracked +| 51|0x0000000684500000, 0x0000000684500000, 0x0000000684600000| 0%| F| |TAMS 0x0000000684500000, 0x0000000684500000| Untracked +| 52|0x0000000684600000, 0x0000000684600000, 0x0000000684700000| 0%| F| |TAMS 0x0000000684600000, 0x0000000684600000| Untracked +| 53|0x0000000684700000, 0x0000000684700000, 0x0000000684800000| 0%| F| |TAMS 0x0000000684700000, 0x0000000684700000| Untracked +| 54|0x0000000684800000, 0x0000000684800000, 0x0000000684900000| 0%| F| |TAMS 0x0000000684800000, 0x0000000684800000| Untracked +| 55|0x0000000684900000, 0x0000000684900000, 0x0000000684a00000| 0%| F| |TAMS 0x0000000684900000, 0x0000000684900000| Untracked +| 56|0x0000000684a00000, 0x0000000684a00000, 0x0000000684b00000| 0%| F| |TAMS 0x0000000684a00000, 0x0000000684a00000| Untracked +| 57|0x0000000684b00000, 0x0000000684b00000, 0x0000000684c00000| 0%| F| |TAMS 0x0000000684b00000, 0x0000000684b00000| Untracked +| 58|0x0000000684c00000, 0x0000000684c00000, 0x0000000684d00000| 0%| F| |TAMS 0x0000000684c00000, 0x0000000684c00000| Untracked +| 59|0x0000000684d00000, 0x0000000684d00000, 0x0000000684e00000| 0%| F| |TAMS 0x0000000684d00000, 0x0000000684d00000| Untracked +| 60|0x0000000684e00000, 0x0000000684e00000, 0x0000000684f00000| 0%| F| |TAMS 0x0000000684e00000, 0x0000000684e00000| Untracked +| 61|0x0000000684f00000, 0x0000000684f00000, 0x0000000685000000| 0%| F| |TAMS 0x0000000684f00000, 0x0000000684f00000| Untracked +| 62|0x0000000685000000, 0x0000000685000000, 0x0000000685100000| 0%| F| |TAMS 0x0000000685000000, 0x0000000685000000| Untracked +| 63|0x0000000685100000, 0x0000000685100000, 0x0000000685200000| 0%| F| |TAMS 0x0000000685100000, 0x0000000685100000| Untracked +| 64|0x0000000685200000, 0x0000000685200000, 0x0000000685300000| 0%| F| |TAMS 0x0000000685200000, 0x0000000685200000| Untracked +| 65|0x0000000685300000, 0x0000000685300000, 0x0000000685400000| 0%| F| |TAMS 0x0000000685300000, 0x0000000685300000| Untracked +| 66|0x0000000685400000, 0x0000000685400000, 0x0000000685500000| 0%| F| |TAMS 0x0000000685400000, 0x0000000685400000| Untracked +| 67|0x0000000685500000, 0x0000000685500000, 0x0000000685600000| 0%| F| |TAMS 0x0000000685500000, 0x0000000685500000| Untracked +| 68|0x0000000685600000, 0x0000000685600000, 0x0000000685700000| 0%| F| |TAMS 0x0000000685600000, 0x0000000685600000| Untracked +| 69|0x0000000685700000, 0x0000000685700000, 0x0000000685800000| 0%| F| |TAMS 0x0000000685700000, 0x0000000685700000| Untracked +| 70|0x0000000685800000, 0x0000000685800000, 0x0000000685900000| 0%| F| |TAMS 0x0000000685800000, 0x0000000685800000| Untracked +| 71|0x0000000685900000, 0x0000000685900000, 0x0000000685a00000| 0%| F| |TAMS 0x0000000685900000, 0x0000000685900000| Untracked +| 72|0x0000000685a00000, 0x0000000685a00000, 0x0000000685b00000| 0%| F| |TAMS 0x0000000685a00000, 0x0000000685a00000| Untracked +| 73|0x0000000685b00000, 0x0000000685b00000, 0x0000000685c00000| 0%| F| |TAMS 0x0000000685b00000, 0x0000000685b00000| Untracked +| 74|0x0000000685c00000, 0x0000000685c00000, 0x0000000685d00000| 0%| F| |TAMS 0x0000000685c00000, 0x0000000685c00000| Untracked +| 75|0x0000000685d00000, 0x0000000685d00000, 0x0000000685e00000| 0%| F| |TAMS 0x0000000685d00000, 0x0000000685d00000| Untracked +| 76|0x0000000685e00000, 0x0000000685e00000, 0x0000000685f00000| 0%| F| |TAMS 0x0000000685e00000, 0x0000000685e00000| Untracked +| 77|0x0000000685f00000, 0x0000000685f00000, 0x0000000686000000| 0%| F| |TAMS 0x0000000685f00000, 0x0000000685f00000| Untracked +| 78|0x0000000686000000, 0x0000000686000000, 0x0000000686100000| 0%| F| |TAMS 0x0000000686000000, 0x0000000686000000| Untracked +| 79|0x0000000686100000, 0x0000000686100000, 0x0000000686200000| 0%| F| |TAMS 0x0000000686100000, 0x0000000686100000| Untracked +| 80|0x0000000686200000, 0x0000000686200000, 0x0000000686300000| 0%| F| |TAMS 0x0000000686200000, 0x0000000686200000| Untracked +| 81|0x0000000686300000, 0x0000000686300000, 0x0000000686400000| 0%| F| |TAMS 0x0000000686300000, 0x0000000686300000| Untracked +| 82|0x0000000686400000, 0x0000000686400000, 0x0000000686500000| 0%| F| |TAMS 0x0000000686400000, 0x0000000686400000| Untracked +| 83|0x0000000686500000, 0x0000000686500000, 0x0000000686600000| 0%| F| |TAMS 0x0000000686500000, 0x0000000686500000| Untracked +| 84|0x0000000686600000, 0x0000000686600000, 0x0000000686700000| 0%| F| |TAMS 0x0000000686600000, 0x0000000686600000| Untracked +| 85|0x0000000686700000, 0x0000000686700000, 0x0000000686800000| 0%| F| |TAMS 0x0000000686700000, 0x0000000686700000| Untracked +| 86|0x0000000686800000, 0x0000000686800000, 0x0000000686900000| 0%| F| |TAMS 0x0000000686800000, 0x0000000686800000| Untracked +| 87|0x0000000686900000, 0x0000000686900000, 0x0000000686a00000| 0%| F| |TAMS 0x0000000686900000, 0x0000000686900000| Untracked +| 88|0x0000000686a00000, 0x0000000686a00000, 0x0000000686b00000| 0%| F| |TAMS 0x0000000686a00000, 0x0000000686a00000| Untracked +| 89|0x0000000686b00000, 0x0000000686b00000, 0x0000000686c00000| 0%| F| |TAMS 0x0000000686b00000, 0x0000000686b00000| Untracked +| 90|0x0000000686c00000, 0x0000000686c00000, 0x0000000686d00000| 0%| F| |TAMS 0x0000000686c00000, 0x0000000686c00000| Untracked +| 91|0x0000000686d00000, 0x0000000686d00000, 0x0000000686e00000| 0%| F| |TAMS 0x0000000686d00000, 0x0000000686d00000| Untracked +| 92|0x0000000686e00000, 0x0000000686e00000, 0x0000000686f00000| 0%| F| |TAMS 0x0000000686e00000, 0x0000000686e00000| Untracked +| 93|0x0000000686f00000, 0x0000000686f00000, 0x0000000687000000| 0%| F| |TAMS 0x0000000686f00000, 0x0000000686f00000| Untracked +| 94|0x0000000687000000, 0x0000000687000000, 0x0000000687100000| 0%| F| |TAMS 0x0000000687000000, 0x0000000687000000| Untracked +| 95|0x0000000687100000, 0x0000000687100000, 0x0000000687200000| 0%| F| |TAMS 0x0000000687100000, 0x0000000687100000| Untracked +| 96|0x0000000687200000, 0x0000000687200000, 0x0000000687300000| 0%| F| |TAMS 0x0000000687200000, 0x0000000687200000| Untracked +| 97|0x0000000687300000, 0x0000000687300000, 0x0000000687400000| 0%| F| |TAMS 0x0000000687300000, 0x0000000687300000| Untracked +| 98|0x0000000687400000, 0x0000000687400000, 0x0000000687500000| 0%| F| |TAMS 0x0000000687400000, 0x0000000687400000| Untracked +| 99|0x0000000687500000, 0x0000000687500000, 0x0000000687600000| 0%| F| |TAMS 0x0000000687500000, 0x0000000687500000| Untracked +| 100|0x0000000687600000, 0x0000000687600000, 0x0000000687700000| 0%| F| |TAMS 0x0000000687600000, 0x0000000687600000| Untracked +| 101|0x0000000687700000, 0x0000000687700000, 0x0000000687800000| 0%| F| |TAMS 0x0000000687700000, 0x0000000687700000| Untracked +| 102|0x0000000687800000, 0x0000000687800000, 0x0000000687900000| 0%| F| |TAMS 0x0000000687800000, 0x0000000687800000| Untracked +| 103|0x0000000687900000, 0x0000000687900000, 0x0000000687a00000| 0%| F| |TAMS 0x0000000687900000, 0x0000000687900000| Untracked +| 104|0x0000000687a00000, 0x0000000687a00000, 0x0000000687b00000| 0%| F| |TAMS 0x0000000687a00000, 0x0000000687a00000| Untracked +| 105|0x0000000687b00000, 0x0000000687b00000, 0x0000000687c00000| 0%| F| |TAMS 0x0000000687b00000, 0x0000000687b00000| Untracked +| 106|0x0000000687c00000, 0x0000000687c00000, 0x0000000687d00000| 0%| F| |TAMS 0x0000000687c00000, 0x0000000687c00000| Untracked +| 107|0x0000000687d00000, 0x0000000687d00000, 0x0000000687e00000| 0%| F| |TAMS 0x0000000687d00000, 0x0000000687d00000| Untracked +| 108|0x0000000687e00000, 0x0000000687e00000, 0x0000000687f00000| 0%| F| |TAMS 0x0000000687e00000, 0x0000000687e00000| Untracked +| 109|0x0000000687f00000, 0x0000000687f00000, 0x0000000688000000| 0%| F| |TAMS 0x0000000687f00000, 0x0000000687f00000| Untracked +| 110|0x0000000688000000, 0x0000000688000000, 0x0000000688100000| 0%| F| |TAMS 0x0000000688000000, 0x0000000688000000| Untracked +| 111|0x0000000688100000, 0x0000000688100000, 0x0000000688200000| 0%| F| |TAMS 0x0000000688100000, 0x0000000688100000| Untracked +| 112|0x0000000688200000, 0x0000000688200000, 0x0000000688300000| 0%| F| |TAMS 0x0000000688200000, 0x0000000688200000| Untracked +| 113|0x0000000688300000, 0x0000000688300000, 0x0000000688400000| 0%| F| |TAMS 0x0000000688300000, 0x0000000688300000| Untracked +| 114|0x0000000688400000, 0x0000000688400000, 0x0000000688500000| 0%| F| |TAMS 0x0000000688400000, 0x0000000688400000| Untracked +| 115|0x0000000688500000, 0x0000000688500000, 0x0000000688600000| 0%| F| |TAMS 0x0000000688500000, 0x0000000688500000| Untracked +| 116|0x0000000688600000, 0x0000000688600000, 0x0000000688700000| 0%| F| |TAMS 0x0000000688600000, 0x0000000688600000| Untracked +| 117|0x0000000688700000, 0x0000000688700000, 0x0000000688800000| 0%| F| |TAMS 0x0000000688700000, 0x0000000688700000| Untracked +| 118|0x0000000688800000, 0x0000000688800000, 0x0000000688900000| 0%| F| |TAMS 0x0000000688800000, 0x0000000688800000| Untracked +| 119|0x0000000688900000, 0x0000000688900000, 0x0000000688a00000| 0%| F| |TAMS 0x0000000688900000, 0x0000000688900000| Untracked +| 120|0x0000000688a00000, 0x0000000688a00000, 0x0000000688b00000| 0%| F| |TAMS 0x0000000688a00000, 0x0000000688a00000| Untracked +| 121|0x0000000688b00000, 0x0000000688b00000, 0x0000000688c00000| 0%| F| |TAMS 0x0000000688b00000, 0x0000000688b00000| Untracked +| 122|0x0000000688c00000, 0x0000000688c00000, 0x0000000688d00000| 0%| F| |TAMS 0x0000000688c00000, 0x0000000688c00000| Untracked +| 123|0x0000000688d00000, 0x0000000688d00000, 0x0000000688e00000| 0%| F| |TAMS 0x0000000688d00000, 0x0000000688d00000| Untracked +| 124|0x0000000688e00000, 0x0000000688e00000, 0x0000000688f00000| 0%| F| |TAMS 0x0000000688e00000, 0x0000000688e00000| Untracked +| 125|0x0000000688f00000, 0x0000000688f00000, 0x0000000689000000| 0%| F| |TAMS 0x0000000688f00000, 0x0000000688f00000| Untracked +| 126|0x0000000689000000, 0x0000000689000000, 0x0000000689100000| 0%| F| |TAMS 0x0000000689000000, 0x0000000689000000| Untracked +| 127|0x0000000689100000, 0x0000000689100000, 0x0000000689200000| 0%| F| |TAMS 0x0000000689100000, 0x0000000689100000| Untracked +| 128|0x0000000689200000, 0x0000000689200000, 0x0000000689300000| 0%| F| |TAMS 0x0000000689200000, 0x0000000689200000| Untracked +| 129|0x0000000689300000, 0x0000000689300000, 0x0000000689400000| 0%| F| |TAMS 0x0000000689300000, 0x0000000689300000| Untracked +| 130|0x0000000689400000, 0x0000000689400000, 0x0000000689500000| 0%| F| |TAMS 0x0000000689400000, 0x0000000689400000| Untracked +| 131|0x0000000689500000, 0x0000000689500000, 0x0000000689600000| 0%| F| |TAMS 0x0000000689500000, 0x0000000689500000| Untracked +| 132|0x0000000689600000, 0x0000000689600000, 0x0000000689700000| 0%| F| |TAMS 0x0000000689600000, 0x0000000689600000| Untracked +| 133|0x0000000689700000, 0x0000000689700000, 0x0000000689800000| 0%| F| |TAMS 0x0000000689700000, 0x0000000689700000| Untracked +| 134|0x0000000689800000, 0x0000000689800000, 0x0000000689900000| 0%| F| |TAMS 0x0000000689800000, 0x0000000689800000| Untracked +| 135|0x0000000689900000, 0x0000000689900000, 0x0000000689a00000| 0%| F| |TAMS 0x0000000689900000, 0x0000000689900000| Untracked +| 136|0x0000000689a00000, 0x0000000689a00000, 0x0000000689b00000| 0%| F| |TAMS 0x0000000689a00000, 0x0000000689a00000| Untracked +| 137|0x0000000689b00000, 0x0000000689b00000, 0x0000000689c00000| 0%| F| |TAMS 0x0000000689b00000, 0x0000000689b00000| Untracked +| 138|0x0000000689c00000, 0x0000000689c00000, 0x0000000689d00000| 0%| F| |TAMS 0x0000000689c00000, 0x0000000689c00000| Untracked +| 139|0x0000000689d00000, 0x0000000689d00000, 0x0000000689e00000| 0%| F| |TAMS 0x0000000689d00000, 0x0000000689d00000| Untracked +| 140|0x0000000689e00000, 0x0000000689e00000, 0x0000000689f00000| 0%| F| |TAMS 0x0000000689e00000, 0x0000000689e00000| Untracked +| 141|0x0000000689f00000, 0x0000000689f00000, 0x000000068a000000| 0%| F| |TAMS 0x0000000689f00000, 0x0000000689f00000| Untracked +| 142|0x000000068a000000, 0x000000068a000000, 0x000000068a100000| 0%| F| |TAMS 0x000000068a000000, 0x000000068a000000| Untracked +| 143|0x000000068a100000, 0x000000068a100000, 0x000000068a200000| 0%| F| |TAMS 0x000000068a100000, 0x000000068a100000| Untracked +| 144|0x000000068a200000, 0x000000068a200000, 0x000000068a300000| 0%| F| |TAMS 0x000000068a200000, 0x000000068a200000| Untracked +| 145|0x000000068a300000, 0x000000068a300000, 0x000000068a400000| 0%| F| |TAMS 0x000000068a300000, 0x000000068a300000| Untracked +| 146|0x000000068a400000, 0x000000068a400000, 0x000000068a500000| 0%| F| |TAMS 0x000000068a400000, 0x000000068a400000| Untracked +| 147|0x000000068a500000, 0x000000068a500000, 0x000000068a600000| 0%| F| |TAMS 0x000000068a500000, 0x000000068a500000| Untracked +| 148|0x000000068a600000, 0x000000068a600000, 0x000000068a700000| 0%| F| |TAMS 0x000000068a600000, 0x000000068a600000| Untracked +| 149|0x000000068a700000, 0x000000068a700000, 0x000000068a800000| 0%| F| |TAMS 0x000000068a700000, 0x000000068a700000| Untracked +| 150|0x000000068a800000, 0x000000068a800000, 0x000000068a900000| 0%| F| |TAMS 0x000000068a800000, 0x000000068a800000| Untracked +| 151|0x000000068a900000, 0x000000068a900000, 0x000000068aa00000| 0%| F| |TAMS 0x000000068a900000, 0x000000068a900000| Untracked +| 152|0x000000068aa00000, 0x000000068aa00000, 0x000000068ab00000| 0%| F| |TAMS 0x000000068aa00000, 0x000000068aa00000| Untracked +| 153|0x000000068ab00000, 0x000000068ab00000, 0x000000068ac00000| 0%| F| |TAMS 0x000000068ab00000, 0x000000068ab00000| Untracked +| 154|0x000000068ac00000, 0x000000068ac00000, 0x000000068ad00000| 0%| F| |TAMS 0x000000068ac00000, 0x000000068ac00000| Untracked +| 155|0x000000068ad00000, 0x000000068ad00000, 0x000000068ae00000| 0%| F| |TAMS 0x000000068ad00000, 0x000000068ad00000| Untracked +| 156|0x000000068ae00000, 0x000000068ae00000, 0x000000068af00000| 0%| F| |TAMS 0x000000068ae00000, 0x000000068ae00000| Untracked +| 157|0x000000068af00000, 0x000000068af00000, 0x000000068b000000| 0%| F| |TAMS 0x000000068af00000, 0x000000068af00000| Untracked +| 158|0x000000068b000000, 0x000000068b000000, 0x000000068b100000| 0%| F| |TAMS 0x000000068b000000, 0x000000068b000000| Untracked +| 159|0x000000068b100000, 0x000000068b100000, 0x000000068b200000| 0%| F| |TAMS 0x000000068b100000, 0x000000068b100000| Untracked +| 160|0x000000068b200000, 0x000000068b200000, 0x000000068b300000| 0%| F| |TAMS 0x000000068b200000, 0x000000068b200000| Untracked +| 161|0x000000068b300000, 0x000000068b300000, 0x000000068b400000| 0%| F| |TAMS 0x000000068b300000, 0x000000068b300000| Untracked +| 162|0x000000068b400000, 0x000000068b400000, 0x000000068b500000| 0%| F| |TAMS 0x000000068b400000, 0x000000068b400000| Untracked +| 163|0x000000068b500000, 0x000000068b500000, 0x000000068b600000| 0%| F| |TAMS 0x000000068b500000, 0x000000068b500000| Untracked +| 164|0x000000068b600000, 0x000000068b600000, 0x000000068b700000| 0%| F| |TAMS 0x000000068b600000, 0x000000068b600000| Untracked +| 165|0x000000068b700000, 0x000000068b700000, 0x000000068b800000| 0%| F| |TAMS 0x000000068b700000, 0x000000068b700000| Untracked +| 166|0x000000068b800000, 0x000000068b800000, 0x000000068b900000| 0%| F| |TAMS 0x000000068b800000, 0x000000068b800000| Untracked +| 167|0x000000068b900000, 0x000000068b900000, 0x000000068ba00000| 0%| F| |TAMS 0x000000068b900000, 0x000000068b900000| Untracked +| 168|0x000000068ba00000, 0x000000068ba00000, 0x000000068bb00000| 0%| F| |TAMS 0x000000068ba00000, 0x000000068ba00000| Untracked +| 169|0x000000068bb00000, 0x000000068bb00000, 0x000000068bc00000| 0%| F| |TAMS 0x000000068bb00000, 0x000000068bb00000| Untracked +| 170|0x000000068bc00000, 0x000000068bc00000, 0x000000068bd00000| 0%| F| |TAMS 0x000000068bc00000, 0x000000068bc00000| Untracked +| 171|0x000000068bd00000, 0x000000068bd00000, 0x000000068be00000| 0%| F| |TAMS 0x000000068bd00000, 0x000000068bd00000| Untracked +| 172|0x000000068be00000, 0x000000068be00000, 0x000000068bf00000| 0%| F| |TAMS 0x000000068be00000, 0x000000068be00000| Untracked +| 173|0x000000068bf00000, 0x000000068bf00000, 0x000000068c000000| 0%| F| |TAMS 0x000000068bf00000, 0x000000068bf00000| Untracked +| 174|0x000000068c000000, 0x000000068c000000, 0x000000068c100000| 0%| F| |TAMS 0x000000068c000000, 0x000000068c000000| Untracked +| 175|0x000000068c100000, 0x000000068c100000, 0x000000068c200000| 0%| F| |TAMS 0x000000068c100000, 0x000000068c100000| Untracked +| 176|0x000000068c200000, 0x000000068c200000, 0x000000068c300000| 0%| F| |TAMS 0x000000068c200000, 0x000000068c200000| Untracked +| 177|0x000000068c300000, 0x000000068c300000, 0x000000068c400000| 0%| F| |TAMS 0x000000068c300000, 0x000000068c300000| Untracked +| 178|0x000000068c400000, 0x000000068c400000, 0x000000068c500000| 0%| F| |TAMS 0x000000068c400000, 0x000000068c400000| Untracked +| 179|0x000000068c500000, 0x000000068c500000, 0x000000068c600000| 0%| F| |TAMS 0x000000068c500000, 0x000000068c500000| Untracked +| 180|0x000000068c600000, 0x000000068c600000, 0x000000068c700000| 0%| F| |TAMS 0x000000068c600000, 0x000000068c600000| Untracked +| 181|0x000000068c700000, 0x000000068c700000, 0x000000068c800000| 0%| F| |TAMS 0x000000068c700000, 0x000000068c700000| Untracked +| 182|0x000000068c800000, 0x000000068c800000, 0x000000068c900000| 0%| F| |TAMS 0x000000068c800000, 0x000000068c800000| Untracked +| 183|0x000000068c900000, 0x000000068c900000, 0x000000068ca00000| 0%| F| |TAMS 0x000000068c900000, 0x000000068c900000| Untracked +| 184|0x000000068ca00000, 0x000000068ca00000, 0x000000068cb00000| 0%| F| |TAMS 0x000000068ca00000, 0x000000068ca00000| Untracked +| 185|0x000000068cb00000, 0x000000068cb00000, 0x000000068cc00000| 0%| F| |TAMS 0x000000068cb00000, 0x000000068cb00000| Untracked +| 186|0x000000068cc00000, 0x000000068cc00000, 0x000000068cd00000| 0%| F| |TAMS 0x000000068cc00000, 0x000000068cc00000| Untracked +| 187|0x000000068cd00000, 0x000000068cd00000, 0x000000068ce00000| 0%| F| |TAMS 0x000000068cd00000, 0x000000068cd00000| Untracked +| 188|0x000000068ce00000, 0x000000068ce00000, 0x000000068cf00000| 0%| F| |TAMS 0x000000068ce00000, 0x000000068ce00000| Untracked +| 189|0x000000068cf00000, 0x000000068cf00000, 0x000000068d000000| 0%| F| |TAMS 0x000000068cf00000, 0x000000068cf00000| Untracked +| 190|0x000000068d000000, 0x000000068d000000, 0x000000068d100000| 0%| F| |TAMS 0x000000068d000000, 0x000000068d000000| Untracked +| 191|0x000000068d100000, 0x000000068d100000, 0x000000068d200000| 0%| F| |TAMS 0x000000068d100000, 0x000000068d100000| Untracked +| 192|0x000000068d200000, 0x000000068d200000, 0x000000068d300000| 0%| F| |TAMS 0x000000068d200000, 0x000000068d200000| Untracked +| 193|0x000000068d300000, 0x000000068d300000, 0x000000068d400000| 0%| F| |TAMS 0x000000068d300000, 0x000000068d300000| Untracked +| 194|0x000000068d400000, 0x000000068d400000, 0x000000068d500000| 0%| F| |TAMS 0x000000068d400000, 0x000000068d400000| Untracked +| 195|0x000000068d500000, 0x000000068d500000, 0x000000068d600000| 0%| F| |TAMS 0x000000068d500000, 0x000000068d500000| Untracked +| 196|0x000000068d600000, 0x000000068d600000, 0x000000068d700000| 0%| F| |TAMS 0x000000068d600000, 0x000000068d600000| Untracked +| 197|0x000000068d700000, 0x000000068d700000, 0x000000068d800000| 0%| F| |TAMS 0x000000068d700000, 0x000000068d700000| Untracked +| 198|0x000000068d800000, 0x000000068d800000, 0x000000068d900000| 0%| F| |TAMS 0x000000068d800000, 0x000000068d800000| Untracked +| 199|0x000000068d900000, 0x000000068d900000, 0x000000068da00000| 0%| F| |TAMS 0x000000068d900000, 0x000000068d900000| Untracked +| 200|0x000000068da00000, 0x000000068da00000, 0x000000068db00000| 0%| F| |TAMS 0x000000068da00000, 0x000000068da00000| Untracked +| 201|0x000000068db00000, 0x000000068db00000, 0x000000068dc00000| 0%| F| |TAMS 0x000000068db00000, 0x000000068db00000| Untracked +| 202|0x000000068dc00000, 0x000000068dc00000, 0x000000068dd00000| 0%| F| |TAMS 0x000000068dc00000, 0x000000068dc00000| Untracked +| 203|0x000000068dd00000, 0x000000068dd00000, 0x000000068de00000| 0%| F| |TAMS 0x000000068dd00000, 0x000000068dd00000| Untracked +| 204|0x000000068de00000, 0x000000068de00000, 0x000000068df00000| 0%| F| |TAMS 0x000000068de00000, 0x000000068de00000| Untracked +| 205|0x000000068df00000, 0x000000068df00000, 0x000000068e000000| 0%| F| |TAMS 0x000000068df00000, 0x000000068df00000| Untracked +| 206|0x000000068e000000, 0x000000068e000000, 0x000000068e100000| 0%| F| |TAMS 0x000000068e000000, 0x000000068e000000| Untracked +| 207|0x000000068e100000, 0x000000068e100000, 0x000000068e200000| 0%| F| |TAMS 0x000000068e100000, 0x000000068e100000| Untracked +| 208|0x000000068e200000, 0x000000068e200000, 0x000000068e300000| 0%| F| |TAMS 0x000000068e200000, 0x000000068e200000| Untracked +| 209|0x000000068e300000, 0x000000068e300000, 0x000000068e400000| 0%| F| |TAMS 0x000000068e300000, 0x000000068e300000| Untracked +| 210|0x000000068e400000, 0x000000068e400000, 0x000000068e500000| 0%| F| |TAMS 0x000000068e400000, 0x000000068e400000| Untracked +| 211|0x000000068e500000, 0x000000068e500000, 0x000000068e600000| 0%| F| |TAMS 0x000000068e500000, 0x000000068e500000| Untracked +| 212|0x000000068e600000, 0x000000068e600000, 0x000000068e700000| 0%| F| |TAMS 0x000000068e600000, 0x000000068e600000| Untracked +| 213|0x000000068e700000, 0x000000068e700000, 0x000000068e800000| 0%| F| |TAMS 0x000000068e700000, 0x000000068e700000| Untracked +| 214|0x000000068e800000, 0x000000068e800000, 0x000000068e900000| 0%| F| |TAMS 0x000000068e800000, 0x000000068e800000| Untracked +| 215|0x000000068e900000, 0x000000068e900000, 0x000000068ea00000| 0%| F| |TAMS 0x000000068e900000, 0x000000068e900000| Untracked +| 216|0x000000068ea00000, 0x000000068ea00000, 0x000000068eb00000| 0%| F| |TAMS 0x000000068ea00000, 0x000000068ea00000| Untracked +| 217|0x000000068eb00000, 0x000000068eb00000, 0x000000068ec00000| 0%| F| |TAMS 0x000000068eb00000, 0x000000068eb00000| Untracked +| 218|0x000000068ec00000, 0x000000068ec00000, 0x000000068ed00000| 0%| F| |TAMS 0x000000068ec00000, 0x000000068ec00000| Untracked +| 219|0x000000068ed00000, 0x000000068ed00000, 0x000000068ee00000| 0%| F| |TAMS 0x000000068ed00000, 0x000000068ed00000| Untracked +| 220|0x000000068ee00000, 0x000000068ee00000, 0x000000068ef00000| 0%| F| |TAMS 0x000000068ee00000, 0x000000068ee00000| Untracked +| 221|0x000000068ef00000, 0x000000068ef00000, 0x000000068f000000| 0%| F| |TAMS 0x000000068ef00000, 0x000000068ef00000| Untracked +| 222|0x000000068f000000, 0x000000068f000000, 0x000000068f100000| 0%| F| |TAMS 0x000000068f000000, 0x000000068f000000| Untracked +| 223|0x000000068f100000, 0x000000068f100000, 0x000000068f200000| 0%| F| |TAMS 0x000000068f100000, 0x000000068f100000| Untracked +| 224|0x000000068f200000, 0x000000068f200000, 0x000000068f300000| 0%| F| |TAMS 0x000000068f200000, 0x000000068f200000| Untracked +| 225|0x000000068f300000, 0x000000068f300000, 0x000000068f400000| 0%| F| |TAMS 0x000000068f300000, 0x000000068f300000| Untracked +| 226|0x000000068f400000, 0x000000068f400000, 0x000000068f500000| 0%| F| |TAMS 0x000000068f400000, 0x000000068f400000| Untracked +| 227|0x000000068f500000, 0x000000068f500000, 0x000000068f600000| 0%| F| |TAMS 0x000000068f500000, 0x000000068f500000| Untracked +| 228|0x000000068f600000, 0x000000068f600000, 0x000000068f700000| 0%| F| |TAMS 0x000000068f600000, 0x000000068f600000| Untracked +| 229|0x000000068f700000, 0x000000068f700000, 0x000000068f800000| 0%| F| |TAMS 0x000000068f700000, 0x000000068f700000| Untracked +| 230|0x000000068f800000, 0x000000068f800000, 0x000000068f900000| 0%| F| |TAMS 0x000000068f800000, 0x000000068f800000| Untracked +| 231|0x000000068f900000, 0x000000068f900000, 0x000000068fa00000| 0%| F| |TAMS 0x000000068f900000, 0x000000068f900000| Untracked +| 232|0x000000068fa00000, 0x000000068fa00000, 0x000000068fb00000| 0%| F| |TAMS 0x000000068fa00000, 0x000000068fa00000| Untracked +| 233|0x000000068fb00000, 0x000000068fb00000, 0x000000068fc00000| 0%| F| |TAMS 0x000000068fb00000, 0x000000068fb00000| Untracked +| 234|0x000000068fc00000, 0x000000068fc00000, 0x000000068fd00000| 0%| F| |TAMS 0x000000068fc00000, 0x000000068fc00000| Untracked +| 235|0x000000068fd00000, 0x000000068fd00000, 0x000000068fe00000| 0%| F| |TAMS 0x000000068fd00000, 0x000000068fd00000| Untracked +| 236|0x000000068fe00000, 0x000000068fe00000, 0x000000068ff00000| 0%| F| |TAMS 0x000000068fe00000, 0x000000068fe00000| Untracked +| 237|0x000000068ff00000, 0x000000068ff00000, 0x0000000690000000| 0%| F| |TAMS 0x000000068ff00000, 0x000000068ff00000| Untracked +| 238|0x0000000690000000, 0x0000000690000000, 0x0000000690100000| 0%| F| |TAMS 0x0000000690000000, 0x0000000690000000| Untracked +| 239|0x0000000690100000, 0x0000000690100000, 0x0000000690200000| 0%| F| |TAMS 0x0000000690100000, 0x0000000690100000| Untracked +| 240|0x0000000690200000, 0x0000000690200000, 0x0000000690300000| 0%| F| |TAMS 0x0000000690200000, 0x0000000690200000| Untracked +| 241|0x0000000690300000, 0x0000000690300000, 0x0000000690400000| 0%| F| |TAMS 0x0000000690300000, 0x0000000690300000| Untracked +| 242|0x0000000690400000, 0x0000000690400000, 0x0000000690500000| 0%| F| |TAMS 0x0000000690400000, 0x0000000690400000| Untracked +| 243|0x0000000690500000, 0x0000000690500000, 0x0000000690600000| 0%| F| |TAMS 0x0000000690500000, 0x0000000690500000| Untracked +| 244|0x0000000690600000, 0x0000000690600000, 0x0000000690700000| 0%| F| |TAMS 0x0000000690600000, 0x0000000690600000| Untracked +| 245|0x0000000690700000, 0x0000000690700000, 0x0000000690800000| 0%| F| |TAMS 0x0000000690700000, 0x0000000690700000| Untracked +| 246|0x0000000690800000, 0x0000000690800000, 0x0000000690900000| 0%| F| |TAMS 0x0000000690800000, 0x0000000690800000| Untracked +| 247|0x0000000690900000, 0x0000000690900000, 0x0000000690a00000| 0%| F| |TAMS 0x0000000690900000, 0x0000000690900000| Untracked +| 248|0x0000000690a00000, 0x0000000690a00000, 0x0000000690b00000| 0%| F| |TAMS 0x0000000690a00000, 0x0000000690a00000| Untracked +| 249|0x0000000690b00000, 0x0000000690b00000, 0x0000000690c00000| 0%| F| |TAMS 0x0000000690b00000, 0x0000000690b00000| Untracked +| 250|0x0000000690c00000, 0x0000000690c00000, 0x0000000690d00000| 0%| F| |TAMS 0x0000000690c00000, 0x0000000690c00000| Untracked +| 251|0x0000000690d00000, 0x0000000690d00000, 0x0000000690e00000| 0%| F| |TAMS 0x0000000690d00000, 0x0000000690d00000| Untracked +| 252|0x0000000690e00000, 0x0000000690e80800, 0x0000000690f00000| 50%| E| |TAMS 0x0000000690e00000, 0x0000000690e00000| Complete +| 253|0x0000000690f00000, 0x0000000691000000, 0x0000000691000000|100%| E|CS|TAMS 0x0000000690f00000, 0x0000000690f00000| Complete +| 254|0x0000000691000000, 0x0000000691100000, 0x0000000691100000|100%| E|CS|TAMS 0x0000000691000000, 0x0000000691000000| Complete +| 255|0x0000000691100000, 0x0000000691200000, 0x0000000691200000|100%| E|CS|TAMS 0x0000000691100000, 0x0000000691100000| Complete +| 256|0x0000000691200000, 0x0000000691300000, 0x0000000691300000|100%| E|CS|TAMS 0x0000000691200000, 0x0000000691200000| Complete +| 257|0x0000000691300000, 0x0000000691400000, 0x0000000691400000|100%| E|CS|TAMS 0x0000000691300000, 0x0000000691300000| Complete +| 258|0x0000000691400000, 0x0000000691500000, 0x0000000691500000|100%| E|CS|TAMS 0x0000000691400000, 0x0000000691400000| Complete +| 259|0x0000000691500000, 0x0000000691600000, 0x0000000691600000|100%| E|CS|TAMS 0x0000000691500000, 0x0000000691500000| Complete +| 260|0x0000000691600000, 0x0000000691700000, 0x0000000691700000|100%| E|CS|TAMS 0x0000000691600000, 0x0000000691600000| Complete +| 261|0x0000000691700000, 0x0000000691800000, 0x0000000691800000|100%| E|CS|TAMS 0x0000000691700000, 0x0000000691700000| Complete +| 262|0x0000000691800000, 0x0000000691900000, 0x0000000691900000|100%| E|CS|TAMS 0x0000000691800000, 0x0000000691800000| Complete +| 263|0x0000000691900000, 0x0000000691a00000, 0x0000000691a00000|100%| E|CS|TAMS 0x0000000691900000, 0x0000000691900000| Complete +| 264|0x0000000691a00000, 0x0000000691b00000, 0x0000000691b00000|100%| E|CS|TAMS 0x0000000691a00000, 0x0000000691a00000| Complete +| 265|0x0000000691b00000, 0x0000000691c00000, 0x0000000691c00000|100%| E|CS|TAMS 0x0000000691b00000, 0x0000000691b00000| Complete +| 266|0x0000000691c00000, 0x0000000691d00000, 0x0000000691d00000|100%| E|CS|TAMS 0x0000000691c00000, 0x0000000691c00000| Complete +| 267|0x0000000691d00000, 0x0000000691e00000, 0x0000000691e00000|100%| E|CS|TAMS 0x0000000691d00000, 0x0000000691d00000| Complete +| 268|0x0000000691e00000, 0x0000000691f00000, 0x0000000691f00000|100%| E|CS|TAMS 0x0000000691e00000, 0x0000000691e00000| Complete +| 269|0x0000000691f00000, 0x0000000692000000, 0x0000000692000000|100%| E|CS|TAMS 0x0000000691f00000, 0x0000000691f00000| Complete +| 270|0x0000000692000000, 0x0000000692100000, 0x0000000692100000|100%| E|CS|TAMS 0x0000000692000000, 0x0000000692000000| Complete +| 271|0x0000000692100000, 0x0000000692200000, 0x0000000692200000|100%| E|CS|TAMS 0x0000000692100000, 0x0000000692100000| Complete +| 272|0x0000000692200000, 0x0000000692300000, 0x0000000692300000|100%| E|CS|TAMS 0x0000000692200000, 0x0000000692200000| Complete +| 273|0x0000000692300000, 0x0000000692400000, 0x0000000692400000|100%| E|CS|TAMS 0x0000000692300000, 0x0000000692300000| Complete +| 274|0x0000000692400000, 0x0000000692500000, 0x0000000692500000|100%| E|CS|TAMS 0x0000000692400000, 0x0000000692400000| Complete +| 275|0x0000000692500000, 0x0000000692600000, 0x0000000692600000|100%| E|CS|TAMS 0x0000000692500000, 0x0000000692500000| Complete +| 276|0x0000000692600000, 0x0000000692700000, 0x0000000692700000|100%| E|CS|TAMS 0x0000000692600000, 0x0000000692600000| Complete +| 277|0x0000000692700000, 0x0000000692800000, 0x0000000692800000|100%| E|CS|TAMS 0x0000000692700000, 0x0000000692700000| Complete +| 278|0x0000000692800000, 0x0000000692900000, 0x0000000692900000|100%| E|CS|TAMS 0x0000000692800000, 0x0000000692800000| Complete +| 279|0x0000000692900000, 0x0000000692a00000, 0x0000000692a00000|100%| E|CS|TAMS 0x0000000692900000, 0x0000000692900000| Complete +| 280|0x0000000692a00000, 0x0000000692b00000, 0x0000000692b00000|100%| E|CS|TAMS 0x0000000692a00000, 0x0000000692a00000| Complete +| 281|0x0000000692b00000, 0x0000000692c00000, 0x0000000692c00000|100%| E|CS|TAMS 0x0000000692b00000, 0x0000000692b00000| Complete +| 282|0x0000000692c00000, 0x0000000692d00000, 0x0000000692d00000|100%| E|CS|TAMS 0x0000000692c00000, 0x0000000692c00000| Complete +| 283|0x0000000692d00000, 0x0000000692e00000, 0x0000000692e00000|100%| E|CS|TAMS 0x0000000692d00000, 0x0000000692d00000| Complete +| 284|0x0000000692e00000, 0x0000000692f00000, 0x0000000692f00000|100%| E|CS|TAMS 0x0000000692e00000, 0x0000000692e00000| Complete +| 285|0x0000000692f00000, 0x0000000693000000, 0x0000000693000000|100%| E|CS|TAMS 0x0000000692f00000, 0x0000000692f00000| Complete +| 286|0x0000000693000000, 0x0000000693100000, 0x0000000693100000|100%| E|CS|TAMS 0x0000000693000000, 0x0000000693000000| Complete +| 287|0x0000000693100000, 0x0000000693200000, 0x0000000693200000|100%| E|CS|TAMS 0x0000000693100000, 0x0000000693100000| Complete +| 288|0x0000000693200000, 0x0000000693300000, 0x0000000693300000|100%| E|CS|TAMS 0x0000000693200000, 0x0000000693200000| Complete +| 289|0x0000000693300000, 0x0000000693400000, 0x0000000693400000|100%| E|CS|TAMS 0x0000000693300000, 0x0000000693300000| Complete +| 290|0x0000000693400000, 0x0000000693500000, 0x0000000693500000|100%| E|CS|TAMS 0x0000000693400000, 0x0000000693400000| Complete +| 291|0x0000000693500000, 0x0000000693600000, 0x0000000693600000|100%| E|CS|TAMS 0x0000000693500000, 0x0000000693500000| Complete +| 292|0x0000000693600000, 0x0000000693700000, 0x0000000693700000|100%| E|CS|TAMS 0x0000000693600000, 0x0000000693600000| Complete +| 293|0x0000000693700000, 0x0000000693800000, 0x0000000693800000|100%| E|CS|TAMS 0x0000000693700000, 0x0000000693700000| Complete +| 294|0x0000000693800000, 0x0000000693900000, 0x0000000693900000|100%| E|CS|TAMS 0x0000000693800000, 0x0000000693800000| Complete +| 295|0x0000000693900000, 0x0000000693a00000, 0x0000000693a00000|100%| E|CS|TAMS 0x0000000693900000, 0x0000000693900000| Complete +| 296|0x0000000693a00000, 0x0000000693b00000, 0x0000000693b00000|100%| E|CS|TAMS 0x0000000693a00000, 0x0000000693a00000| Complete +| 297|0x0000000693b00000, 0x0000000693c00000, 0x0000000693c00000|100%| E|CS|TAMS 0x0000000693b00000, 0x0000000693b00000| Complete +| 298|0x0000000693c00000, 0x0000000693d00000, 0x0000000693d00000|100%| E|CS|TAMS 0x0000000693c00000, 0x0000000693c00000| Complete +| 299|0x0000000693d00000, 0x0000000693e00000, 0x0000000693e00000|100%| E|CS|TAMS 0x0000000693d00000, 0x0000000693d00000| Complete +| 300|0x0000000693e00000, 0x0000000693f00000, 0x0000000693f00000|100%| E|CS|TAMS 0x0000000693e00000, 0x0000000693e00000| Complete +| 301|0x0000000693f00000, 0x0000000694000000, 0x0000000694000000|100%| E|CS|TAMS 0x0000000693f00000, 0x0000000693f00000| Complete +| 302|0x0000000694000000, 0x0000000694100000, 0x0000000694100000|100%| E|CS|TAMS 0x0000000694000000, 0x0000000694000000| Complete +| 303|0x0000000694100000, 0x0000000694200000, 0x0000000694200000|100%| E|CS|TAMS 0x0000000694100000, 0x0000000694100000| Complete +| 304|0x0000000694200000, 0x0000000694300000, 0x0000000694300000|100%| E|CS|TAMS 0x0000000694200000, 0x0000000694200000| Complete +| 305|0x0000000694300000, 0x0000000694400000, 0x0000000694400000|100%| E|CS|TAMS 0x0000000694300000, 0x0000000694300000| Complete +| 306|0x0000000694400000, 0x0000000694500000, 0x0000000694500000|100%| E|CS|TAMS 0x0000000694400000, 0x0000000694400000| Complete +| 307|0x0000000694500000, 0x0000000694600000, 0x0000000694600000|100%| E|CS|TAMS 0x0000000694500000, 0x0000000694500000| Complete +| 308|0x0000000694600000, 0x0000000694700000, 0x0000000694700000|100%| E|CS|TAMS 0x0000000694600000, 0x0000000694600000| Complete +| 309|0x0000000694700000, 0x0000000694800000, 0x0000000694800000|100%| E|CS|TAMS 0x0000000694700000, 0x0000000694700000| Complete +| 310|0x0000000694800000, 0x0000000694900000, 0x0000000694900000|100%| E|CS|TAMS 0x0000000694800000, 0x0000000694800000| Complete +| 311|0x0000000694900000, 0x0000000694a00000, 0x0000000694a00000|100%| E|CS|TAMS 0x0000000694900000, 0x0000000694900000| Complete +| 312|0x0000000694a00000, 0x0000000694b00000, 0x0000000694b00000|100%| E|CS|TAMS 0x0000000694a00000, 0x0000000694a00000| Complete +| 313|0x0000000694b00000, 0x0000000694c00000, 0x0000000694c00000|100%| E|CS|TAMS 0x0000000694b00000, 0x0000000694b00000| Complete +| 314|0x0000000694c00000, 0x0000000694d00000, 0x0000000694d00000|100%| E|CS|TAMS 0x0000000694c00000, 0x0000000694c00000| Complete +| 315|0x0000000694d00000, 0x0000000694e00000, 0x0000000694e00000|100%| E|CS|TAMS 0x0000000694d00000, 0x0000000694d00000| Complete +| 316|0x0000000694e00000, 0x0000000694f00000, 0x0000000694f00000|100%| E|CS|TAMS 0x0000000694e00000, 0x0000000694e00000| Complete +| 317|0x0000000694f00000, 0x0000000695000000, 0x0000000695000000|100%| E|CS|TAMS 0x0000000694f00000, 0x0000000694f00000| Complete +| 318|0x0000000695000000, 0x0000000695100000, 0x0000000695100000|100%| S|CS|TAMS 0x0000000695000000, 0x0000000695000000| Complete +| 319|0x0000000695100000, 0x0000000695200000, 0x0000000695200000|100%| S|CS|TAMS 0x0000000695100000, 0x0000000695100000| Complete +| 320|0x0000000695200000, 0x0000000695300000, 0x0000000695300000|100%| S|CS|TAMS 0x0000000695200000, 0x0000000695200000| Complete +| 321|0x0000000695300000, 0x0000000695400000, 0x0000000695400000|100%| S|CS|TAMS 0x0000000695300000, 0x0000000695300000| Complete +| 322|0x0000000695400000, 0x0000000695500000, 0x0000000695500000|100%| S|CS|TAMS 0x0000000695400000, 0x0000000695400000| Complete +| 323|0x0000000695500000, 0x0000000695600000, 0x0000000695600000|100%| S|CS|TAMS 0x0000000695500000, 0x0000000695500000| Complete +| 324|0x0000000695600000, 0x0000000695700000, 0x0000000695700000|100%| S|CS|TAMS 0x0000000695600000, 0x0000000695600000| Complete +| 325|0x0000000695700000, 0x0000000695800000, 0x0000000695800000|100%| S|CS|TAMS 0x0000000695700000, 0x0000000695700000| Complete +| 326|0x0000000695800000, 0x0000000695900000, 0x0000000695900000|100%| E|CS|TAMS 0x0000000695800000, 0x0000000695800000| Complete +| 327|0x0000000695900000, 0x0000000695a00000, 0x0000000695a00000|100%| E|CS|TAMS 0x0000000695900000, 0x0000000695900000| Complete +| 328|0x0000000695a00000, 0x0000000695b00000, 0x0000000695b00000|100%| E|CS|TAMS 0x0000000695a00000, 0x0000000695a00000| Complete +| 329|0x0000000695b00000, 0x0000000695c00000, 0x0000000695c00000|100%| E|CS|TAMS 0x0000000695b00000, 0x0000000695b00000| Complete +| 330|0x0000000695c00000, 0x0000000695d00000, 0x0000000695d00000|100%| E|CS|TAMS 0x0000000695c00000, 0x0000000695c00000| Complete +| 331|0x0000000695d00000, 0x0000000695e00000, 0x0000000695e00000|100%| E|CS|TAMS 0x0000000695d00000, 0x0000000695d00000| Complete +| 332|0x0000000695e00000, 0x0000000695f00000, 0x0000000695f00000|100%| E|CS|TAMS 0x0000000695e00000, 0x0000000695e00000| Complete +| 333|0x0000000695f00000, 0x0000000696000000, 0x0000000696000000|100%| E|CS|TAMS 0x0000000695f00000, 0x0000000695f00000| Complete +| 334|0x0000000696000000, 0x0000000696100000, 0x0000000696100000|100%| E|CS|TAMS 0x0000000696000000, 0x0000000696000000| Complete +| 335|0x0000000696100000, 0x0000000696200000, 0x0000000696200000|100%| E|CS|TAMS 0x0000000696100000, 0x0000000696100000| Complete +| 336|0x0000000696200000, 0x0000000696300000, 0x0000000696300000|100%| E|CS|TAMS 0x0000000696200000, 0x0000000696200000| Complete +| 337|0x0000000696300000, 0x0000000696400000, 0x0000000696400000|100%| E|CS|TAMS 0x0000000696300000, 0x0000000696300000| Complete +| 338|0x0000000696400000, 0x0000000696500000, 0x0000000696500000|100%| E|CS|TAMS 0x0000000696400000, 0x0000000696400000| Complete +| 339|0x0000000696500000, 0x0000000696600000, 0x0000000696600000|100%| E|CS|TAMS 0x0000000696500000, 0x0000000696500000| Complete +| 340|0x0000000696600000, 0x0000000696700000, 0x0000000696700000|100%| E|CS|TAMS 0x0000000696600000, 0x0000000696600000| Complete +| 341|0x0000000696700000, 0x0000000696800000, 0x0000000696800000|100%| E|CS|TAMS 0x0000000696700000, 0x0000000696700000| Complete +| 342|0x0000000696800000, 0x0000000696900000, 0x0000000696900000|100%| E|CS|TAMS 0x0000000696800000, 0x0000000696800000| Complete +| 343|0x0000000696900000, 0x0000000696a00000, 0x0000000696a00000|100%| E|CS|TAMS 0x0000000696900000, 0x0000000696900000| Complete +| 344|0x0000000696a00000, 0x0000000696b00000, 0x0000000696b00000|100%| E|CS|TAMS 0x0000000696a00000, 0x0000000696a00000| Complete +| 345|0x0000000696b00000, 0x0000000696c00000, 0x0000000696c00000|100%| E|CS|TAMS 0x0000000696b00000, 0x0000000696b00000| Complete +| 346|0x0000000696c00000, 0x0000000696d00000, 0x0000000696d00000|100%| E|CS|TAMS 0x0000000696c00000, 0x0000000696c00000| Complete +| 347|0x0000000696d00000, 0x0000000696e00000, 0x0000000696e00000|100%| E|CS|TAMS 0x0000000696d00000, 0x0000000696d00000| Complete +| 348|0x0000000696e00000, 0x0000000696f00000, 0x0000000696f00000|100%| E|CS|TAMS 0x0000000696e00000, 0x0000000696e00000| Complete +| 349|0x0000000696f00000, 0x0000000697000000, 0x0000000697000000|100%| E|CS|TAMS 0x0000000696f00000, 0x0000000696f00000| Complete +| 350|0x0000000697000000, 0x0000000697100000, 0x0000000697100000|100%| E|CS|TAMS 0x0000000697000000, 0x0000000697000000| Complete +| 351|0x0000000697100000, 0x0000000697200000, 0x0000000697200000|100%| E|CS|TAMS 0x0000000697100000, 0x0000000697100000| Complete +| 352|0x0000000697200000, 0x0000000697300000, 0x0000000697300000|100%| E|CS|TAMS 0x0000000697200000, 0x0000000697200000| Complete +| 353|0x0000000697300000, 0x0000000697400000, 0x0000000697400000|100%| E|CS|TAMS 0x0000000697300000, 0x0000000697300000| Complete +| 354|0x0000000697400000, 0x0000000697500000, 0x0000000697500000|100%| E|CS|TAMS 0x0000000697400000, 0x0000000697400000| Complete +| 355|0x0000000697500000, 0x0000000697600000, 0x0000000697600000|100%| E|CS|TAMS 0x0000000697500000, 0x0000000697500000| Complete +| 356|0x0000000697600000, 0x0000000697700000, 0x0000000697700000|100%| E|CS|TAMS 0x0000000697600000, 0x0000000697600000| Complete +| 357|0x0000000697700000, 0x0000000697800000, 0x0000000697800000|100%| E|CS|TAMS 0x0000000697700000, 0x0000000697700000| Complete +| 358|0x0000000697800000, 0x0000000697900000, 0x0000000697900000|100%| E|CS|TAMS 0x0000000697800000, 0x0000000697800000| Complete +| 359|0x0000000697900000, 0x0000000697a00000, 0x0000000697a00000|100%| E|CS|TAMS 0x0000000697900000, 0x0000000697900000| Complete +| 360|0x0000000697a00000, 0x0000000697b00000, 0x0000000697b00000|100%| E|CS|TAMS 0x0000000697a00000, 0x0000000697a00000| Complete +| 361|0x0000000697b00000, 0x0000000697c00000, 0x0000000697c00000|100%| E|CS|TAMS 0x0000000697b00000, 0x0000000697b00000| Complete +| 362|0x0000000697c00000, 0x0000000697d00000, 0x0000000697d00000|100%| E|CS|TAMS 0x0000000697c00000, 0x0000000697c00000| Complete +| 363|0x0000000697d00000, 0x0000000697e00000, 0x0000000697e00000|100%| E|CS|TAMS 0x0000000697d00000, 0x0000000697d00000| Complete +| 364|0x0000000697e00000, 0x0000000697f00000, 0x0000000697f00000|100%| E|CS|TAMS 0x0000000697e00000, 0x0000000697e00000| Complete +| 365|0x0000000697f00000, 0x0000000698000000, 0x0000000698000000|100%| E|CS|TAMS 0x0000000697f00000, 0x0000000697f00000| Complete +| 366|0x0000000698000000, 0x0000000698100000, 0x0000000698100000|100%| E|CS|TAMS 0x0000000698000000, 0x0000000698000000| Complete +| 367|0x0000000698100000, 0x0000000698200000, 0x0000000698200000|100%| E|CS|TAMS 0x0000000698100000, 0x0000000698100000| Complete +| 368|0x0000000698200000, 0x0000000698300000, 0x0000000698300000|100%| E|CS|TAMS 0x0000000698200000, 0x0000000698200000| Complete +| 369|0x0000000698300000, 0x0000000698400000, 0x0000000698400000|100%| E|CS|TAMS 0x0000000698300000, 0x0000000698300000| Complete +| 370|0x0000000698400000, 0x0000000698500000, 0x0000000698500000|100%| E|CS|TAMS 0x0000000698400000, 0x0000000698400000| Complete +| 371|0x0000000698500000, 0x0000000698600000, 0x0000000698600000|100%| E|CS|TAMS 0x0000000698500000, 0x0000000698500000| Complete +| 372|0x0000000698600000, 0x0000000698700000, 0x0000000698700000|100%| E|CS|TAMS 0x0000000698600000, 0x0000000698600000| Complete +| 373|0x0000000698700000, 0x0000000698800000, 0x0000000698800000|100%| E|CS|TAMS 0x0000000698700000, 0x0000000698700000| Complete +| 374|0x0000000698800000, 0x0000000698900000, 0x0000000698900000|100%| E|CS|TAMS 0x0000000698800000, 0x0000000698800000| Complete +| 375|0x0000000698900000, 0x0000000698a00000, 0x0000000698a00000|100%| E|CS|TAMS 0x0000000698900000, 0x0000000698900000| Complete +| 376|0x0000000698a00000, 0x0000000698b00000, 0x0000000698b00000|100%| E|CS|TAMS 0x0000000698a00000, 0x0000000698a00000| Complete +| 377|0x0000000698b00000, 0x0000000698c00000, 0x0000000698c00000|100%| E|CS|TAMS 0x0000000698b00000, 0x0000000698b00000| Complete +| 378|0x0000000698c00000, 0x0000000698d00000, 0x0000000698d00000|100%| E|CS|TAMS 0x0000000698c00000, 0x0000000698c00000| Complete +| 379|0x0000000698d00000, 0x0000000698e00000, 0x0000000698e00000|100%| E|CS|TAMS 0x0000000698d00000, 0x0000000698d00000| Complete +| 380|0x0000000698e00000, 0x0000000698f00000, 0x0000000698f00000|100%| E|CS|TAMS 0x0000000698e00000, 0x0000000698e00000| Complete +| 381|0x0000000698f00000, 0x0000000699000000, 0x0000000699000000|100%| E|CS|TAMS 0x0000000698f00000, 0x0000000698f00000| Complete +| 382|0x0000000699000000, 0x0000000699100000, 0x0000000699100000|100%| E|CS|TAMS 0x0000000699000000, 0x0000000699000000| Complete +| 383|0x0000000699100000, 0x0000000699200000, 0x0000000699200000|100%| E|CS|TAMS 0x0000000699100000, 0x0000000699100000| Complete + +Card table byte_map: [0x000002a63c310000,0x000002a63cf10000] _byte_map_base: 0x000002a638f07000 + +Marking Bits (Prev, Next): (CMBitMap*) 0x000002a6287efc18, (CMBitMap*) 0x000002a6287efc50 + Prev Bits: [0x000002a63db10000, 0x000002a643ac8000) + Next Bits: [0x000002a643ad0000, 0x000002a649a88000) + +Polling page: 0x000002a626f40000 + +Metaspace: + +Usage: + Non-class: 50.38 MB capacity, 49.92 MB (>99%) used, 376.73 KB ( <1%) free+waste, 93.94 KB ( <1%) overhead. + Class: 6.76 MB capacity, 6.50 MB ( 96%) used, 227.01 KB ( 3%) free+waste, 41.56 KB ( <1%) overhead. + Both: 57.14 MB capacity, 56.42 MB ( 99%) used, 603.73 KB ( 1%) free+waste, 135.50 KB ( <1%) overhead. + +Virtual space: + Non-class space: 52.00 MB reserved, 50.45 MB ( 97%) committed + Class space: 1.00 GB reserved, 6.82 MB ( <1%) committed + Both: 1.05 GB reserved, 57.28 MB ( 5%) committed + +Chunk freelists: + Non-Class: 12.00 KB + Class: 21.00 KB + Both: 33.00 KB + +MaxMetaspaceSize: 17179869184.00 GB +CompressedClassSpaceSize: 1.00 GB + +CodeHeap 'non-profiled nmethods': size=120064Kb used=3286Kb max_used=3286Kb free=116777Kb + bounds [0x000002a633bb0000, 0x000002a633ef0000, 0x000002a63b0f0000] +CodeHeap 'profiled nmethods': size=120000Kb used=15901Kb max_used=15901Kb free=104098Kb + bounds [0x000002a62c680000, 0x000002a62d610000, 0x000002a633bb0000] +CodeHeap 'non-nmethods': size=5696Kb used=1217Kb max_used=1263Kb free=4478Kb + bounds [0x000002a62c0f0000, 0x000002a62c360000, 0x000002a62c680000] + total_blobs=7055 nmethods=6489 adapters=476 + compilation: enabled + stopped_count=0, restarted_count=0 + full_count=0 + +Compilation events (20 events): +Event: 7.710 Thread 0x000002a64ccfe800 nmethod 6480% 0x000002a633ee4490 code [0x000002a633ee4660, 0x000002a633ee4cf8] +Event: 7.711 Thread 0x000002a64ccfe800 6235 4 java.util.ArrayList::fastRemove (44 bytes) +Event: 7.711 Thread 0x000002a64cb06000 6534 2 org.jetbrains.kotlin.resolve.TypeResolver::resolveType (44 bytes) +Event: 7.712 Thread 0x000002a64cb06000 nmethod 6534 0x000002a62d5f6910 code [0x000002a62d5f6bc0, 0x000002a62d5f72c8] +Event: 7.712 Thread 0x000002a64cb06000 6535 2 kotlin.jvm.internal.CollectionToArray::toArray (288 bytes) +Event: 7.712 Thread 0x000002a64ccfe800 nmethod 6235 0x000002a633ee5210 code [0x000002a633ee53a0, 0x000002a633ee54b8] +Event: 7.712 Thread 0x000002a64ccfe800 6240 4 org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.LeafElement::getTextLength (10 bytes) +Event: 7.712 Thread 0x000002a64ccfe800 nmethod 6240 0x000002a633ee5590 code [0x000002a633ee5720, 0x000002a633ee57d8] +Event: 7.712 Thread 0x000002a64ccfe800 6423 4 org.jetbrains.kotlin.com.intellij.psi.impl.source.CharTableImpl::intern (71 bytes) +Event: 7.713 Thread 0x000002a64cb06000 nmethod 6535 0x000002a62d5f7790 code [0x000002a62d5f7aa0, 0x000002a62d5f8608] +Event: 7.713 Thread 0x000002a64cb06000 6536 2 org.jetbrains.kotlin.resolve.lazy.data.KtClassOrObjectInfo::getPrimaryConstructorParameters (17 bytes) +Event: 7.713 Thread 0x000002a64cb06000 nmethod 6536 0x000002a62d5f8c90 code [0x000002a62d5f8e80, 0x000002a62d5f9148] +Event: 7.719 Thread 0x000002a64cb06000 6537 2 java.util.AbstractList$SubList::iterator (5 bytes) +Event: 7.719 Thread 0x000002a64cb06000 nmethod 6537 0x000002a62d5f9390 code [0x000002a62d5f9580, 0x000002a62d5f98f8] +Event: 7.720 Thread 0x000002a64cb06000 6538 2 java.util.HashMap::afterNodeRemoval (1 bytes) +Event: 7.720 Thread 0x000002a64cb06000 nmethod 6538 0x000002a62d5f9b10 code [0x000002a62d5f9cc0, 0x000002a62d5f9db8] +Event: 7.721 Thread 0x000002a64cb06000 6539 2 org.jetbrains.kotlin.psi.KtBlockExpression:: (9 bytes) +Event: 7.722 Thread 0x000002a64cb06000 nmethod 6539 0x000002a62d5f9e90 code [0x000002a62d5fa060, 0x000002a62d5fa1b8] +Event: 7.726 Thread 0x000002a64cb06000 6542 2 org.jetbrains.kotlin.psi.KtTypeParameterListOwnerStub:: (14 bytes) +Event: 7.727 Thread 0x000002a64cb06000 nmethod 6542 0x000002a62d5fa290 code [0x000002a62d5fa480, 0x000002a62d5fa748] + +GC Heap History (12 events): +Event: 0.554 GC heap before +{Heap before GC invocations=0 (full 0): + garbage-first heap total 393216K, used 22528K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 19 young (19456K), 0 survivors (0K) + Metaspace used 10933K, capacity 11023K, committed 11264K, reserved 1058816K + class space used 978K, capacity 1012K, committed 1024K, reserved 1048576K +} +Event: 0.557 GC heap after +{Heap after GC invocations=1 (full 0): + garbage-first heap total 393216K, used 5272K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 3 young (3072K), 3 survivors (3072K) + Metaspace used 10933K, capacity 11023K, committed 11264K, reserved 1058816K + class space used 978K, capacity 1012K, committed 1024K, reserved 1048576K +} +Event: 1.355 GC heap before +{Heap before GC invocations=1 (full 0): + garbage-first heap total 393216K, used 46232K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 44 young (45056K), 3 survivors (3072K) + Metaspace used 20998K, capacity 21194K, committed 21248K, reserved 1069056K + class space used 2216K, capacity 2297K, committed 2304K, reserved 1048576K +} +Event: 1.367 GC heap after +{Heap after GC invocations=2 (full 0): + garbage-first heap total 393216K, used 9407K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 7 young (7168K), 7 survivors (7168K) + Metaspace used 20998K, capacity 21194K, committed 21248K, reserved 1069056K + class space used 2216K, capacity 2297K, committed 2304K, reserved 1048576K +} +Event: 2.465 GC heap before +{Heap before GC invocations=3 (full 0): + garbage-first heap total 393216K, used 75967K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 60 young (61440K), 7 survivors (7168K) + Metaspace used 32403K, capacity 32849K, committed 33020K, reserved 1079296K + class space used 3816K, capacity 3998K, committed 4096K, reserved 1048576K +} +Event: 2.484 GC heap after +{Heap after GC invocations=4 (full 0): + garbage-first heap total 393216K, used 23779K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 8 young (8192K), 8 survivors (8192K) + Metaspace used 32403K, capacity 32849K, committed 33020K, reserved 1079296K + class space used 3816K, capacity 3998K, committed 4096K, reserved 1048576K +} +Event: 2.696 GC heap before +{Heap before GC invocations=4 (full 0): + garbage-first heap total 393216K, used 35043K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 19 young (19456K), 8 survivors (8192K) + Metaspace used 34392K, capacity 34845K, committed 34940K, reserved 1079296K + class space used 4022K, capacity 4194K, committed 4224K, reserved 1048576K +} +Event: 2.703 GC heap after +{Heap after GC invocations=5 (full 0): + garbage-first heap total 393216K, used 23223K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 2 young (2048K), 2 survivors (2048K) + Metaspace used 34392K, capacity 34845K, committed 34940K, reserved 1079296K + class space used 4022K, capacity 4194K, committed 4224K, reserved 1048576K +} +Event: 2.801 GC heap before +{Heap before GC invocations=5 (full 0): + garbage-first heap total 393216K, used 28343K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 8 young (8192K), 2 survivors (2048K) + Metaspace used 35448K, capacity 35917K, committed 36048K, reserved 1081344K + class space used 4126K, capacity 4295K, committed 4352K, reserved 1048576K +} +Event: 2.802 GC heap after +{Heap after GC invocations=6 (full 0): + garbage-first heap total 393216K, used 23817K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 3 young (3072K), 3 survivors (3072K) + Metaspace used 35448K, capacity 35917K, committed 36048K, reserved 1081344K + class space used 4126K, capacity 4295K, committed 4352K, reserved 1048576K +} +Event: 4.074 GC heap before +{Heap before GC invocations=7 (full 0): + garbage-first heap total 393216K, used 82185K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 58 young (59392K), 3 survivors (3072K) + Metaspace used 47128K, capacity 47757K, committed 48028K, reserved 1091584K + class space used 5489K, capacity 5720K, committed 5836K, reserved 1048576K +} +Event: 4.081 GC heap after +{Heap after GC invocations=8 (full 0): + garbage-first heap total 393216K, used 32187K [0x0000000681200000, 0x0000000800000000) + region size 1024K, 8 young (8192K), 8 survivors (8192K) + Metaspace used 47128K, capacity 47757K, committed 48028K, reserved 1091584K + class space used 5489K, capacity 5720K, committed 5836K, reserved 1048576K +} + +Deoptimization events (20 events): +Event: 7.668 Thread 0x000002a628769800 Uncommon trap: trap_request=0xffffffde fr.pc=0x000002a633e72324 relative=0x0000000000001644 +Event: 7.668 Thread 0x000002a628769800 Uncommon trap: reason=class_check action=maybe_recompile pc=0x000002a633e72324 method=org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaScope.getFunctionNamesLazy()Ljava/util/Set; @ 13 c2 +Event: 7.668 Thread 0x000002a628769800 DEOPT PACKING pc=0x000002a633e72324 sp=0x000000f556bfc4a0 +Event: 7.668 Thread 0x000002a628769800 DEOPT UNPACKING pc=0x000002a62c11772f sp=0x000000f556bfc3d0 mode 2 +Event: 7.670 Thread 0x000002a628769800 Uncommon trap: trap_request=0xffffffde fr.pc=0x000002a633e1a7b0 relative=0x0000000000002b90 +Event: 7.670 Thread 0x000002a628769800 Uncommon trap: reason=class_check action=maybe_recompile pc=0x000002a633e1a7b0 method=org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope.hasClass(Lorg/jetbrains/kotlin/name/Name;)Z @ 28 c2 +Event: 7.670 Thread 0x000002a628769800 DEOPT PACKING pc=0x000002a633e1a7b0 sp=0x000000f556bfc5d0 +Event: 7.670 Thread 0x000002a628769800 DEOPT UNPACKING pc=0x000002a62c11772f sp=0x000000f556bfc520 mode 2 +Event: 7.670 Thread 0x000002a628769800 Uncommon trap: trap_request=0xffffffde fr.pc=0x000002a633e1a7b0 relative=0x0000000000002b90 +Event: 7.670 Thread 0x000002a628769800 Uncommon trap: reason=class_check action=maybe_recompile pc=0x000002a633e1a7b0 method=org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope.hasClass(Lorg/jetbrains/kotlin/name/Name;)Z @ 28 c2 +Event: 7.670 Thread 0x000002a628769800 DEOPT PACKING pc=0x000002a633e1a7b0 sp=0x000000f556bfc5d0 +Event: 7.670 Thread 0x000002a628769800 DEOPT UNPACKING pc=0x000002a62c11772f sp=0x000000f556bfc520 mode 2 +Event: 7.670 Thread 0x000002a628769800 Uncommon trap: trap_request=0xffffffde fr.pc=0x000002a633e1a7b0 relative=0x0000000000002b90 +Event: 7.670 Thread 0x000002a628769800 Uncommon trap: reason=class_check action=maybe_recompile pc=0x000002a633e1a7b0 method=org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope.hasClass(Lorg/jetbrains/kotlin/name/Name;)Z @ 28 c2 +Event: 7.670 Thread 0x000002a628769800 DEOPT PACKING pc=0x000002a633e1a7b0 sp=0x000000f556bfc5d0 +Event: 7.670 Thread 0x000002a628769800 DEOPT UNPACKING pc=0x000002a62c11772f sp=0x000000f556bfc520 mode 2 +Event: 7.670 Thread 0x000002a628769800 Uncommon trap: trap_request=0xffffffde fr.pc=0x000002a633e1a7b0 relative=0x0000000000002b90 +Event: 7.670 Thread 0x000002a628769800 Uncommon trap: reason=class_check action=maybe_recompile pc=0x000002a633e1a7b0 method=org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope.hasClass(Lorg/jetbrains/kotlin/name/Name;)Z @ 28 c2 +Event: 7.670 Thread 0x000002a628769800 DEOPT PACKING pc=0x000002a633e1a7b0 sp=0x000000f556bfc5d0 +Event: 7.670 Thread 0x000002a628769800 DEOPT UNPACKING pc=0x000002a62c11772f sp=0x000000f556bfc520 mode 2 + +Classes redefined (0 events): +No events + +Internal exceptions (20 events): +Event: 1.855 Thread 0x000002a628769800 Exception (0x0000000697947828) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 2.598 Thread 0x000002a628769800 Exception (0x0000000698c21660) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 3.285 Thread 0x000002a628769800 Exception (0x000000069734dec8) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 3.361 Thread 0x000002a628769800 Implicit null exception at 0x000002a633ce48ec to 0x000002a633ce5144 +Event: 3.694 Thread 0x000002a628769800 Implicit null exception at 0x000002a633ce3cf0 to 0x000002a633ce3dbc +Event: 3.800 Thread 0x000002a628769800 Exception (0x000000069619b588) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 3.801 Thread 0x000002a628769800 Exception (0x000000069619f1f8) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 3.801 Thread 0x000002a628769800 Exception (0x00000006961a2508) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 4.954 Thread 0x000002a628769800 Exception (0x0000000696544960) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 5.114 Thread 0x000002a628769800 Exception (0x00000006960c0bb0) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 5.226 Thread 0x000002a628769800 Exception (0x0000000695d5c7d0) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 5.307 Thread 0x000002a628769800 Exception (0x0000000695a66368) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 5.313 Thread 0x000002a628769800 Exception (0x0000000695a90360) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 5.339 Thread 0x000002a628769800 Exception (0x000000069594c350) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 5.339 Thread 0x000002a628769800 Exception (0x0000000695950198) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 5.580 Thread 0x000002a628769800 Implicit null exception at 0x000002a633cdcbcc to 0x000002a633cdccb4 +Event: 5.624 Thread 0x000002a628769800 Exception (0x0000000694a080a8) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 7.056 Thread 0x000002a628769800 Exception (0x000000069238d5c8) thrown at [./src/hotspot/share/interpreter/linkResolver.cpp, line 773] +Event: 7.354 Thread 0x000002a628769800 Implicit null exception at 0x000002a633e4ee47 to 0x000002a633e4f050 +Event: 7.354 Thread 0x000002a628769800 Implicit null exception at 0x000002a633cad5c3 to 0x000002a633cad748 + +Events (20 events): +Event: 7.684 loading class org/jetbrains/kotlin/contracts/model/structure/ESKotlinType +Event: 7.684 loading class org/jetbrains/kotlin/contracts/model/structure/ESKotlinType done +Event: 7.684 loading class org/jetbrains/kotlin/contracts/model/structure/CallComputation +Event: 7.684 loading class org/jetbrains/kotlin/contracts/model/structure/CallComputation done +Event: 7.684 loading class org/jetbrains/kotlin/contracts/description/ContractProviderKey +Event: 7.684 loading class org/jetbrains/kotlin/contracts/description/ContractProviderKey done +Event: 7.684 loading class org/jetbrains/kotlin/contracts/model/structure/UNKNOWN_COMPUTATION +Event: 7.684 loading class org/jetbrains/kotlin/contracts/model/structure/UNKNOWN_COMPUTATION done +Event: 7.685 loading class org/jetbrains/kotlin/contracts/model/visitors/InfoCollector +Event: 7.685 loading class org/jetbrains/kotlin/contracts/model/visitors/InfoCollector done +Event: 7.685 loading class org/jetbrains/kotlin/contracts/model/MutableContextInfo +Event: 7.685 loading class org/jetbrains/kotlin/contracts/model/MutableContextInfo done +Event: 7.686 loading class org/jetbrains/kotlin/contracts/model/MutableContextInfo$Companion +Event: 7.686 loading class org/jetbrains/kotlin/contracts/model/MutableContextInfo$Companion done +Event: 7.686 loading class org/jetbrains/kotlin/contracts/ContextInfoToDataFlowInfoKt +Event: 7.686 loading class org/jetbrains/kotlin/contracts/ContextInfoToDataFlowInfoKt done +Event: 7.687 loading class org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResultsUtil +Event: 7.687 loading class org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResultsUtil done +Event: 7.689 loading class org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformerKt$hasInferredReturnType$1 +Event: 7.689 loading class org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformerKt$hasInferredReturnType$1 done + + +Dynamic libraries: +0x00007ff7deac0000 - 0x00007ff7deaca000 C:\Program Files\Android\Android Studio\jre\bin\java.exe +0x00007ff8113b0000 - 0x00007ff8115a5000 C:\WINDOWS\SYSTEM32\ntdll.dll +0x00007ff8100b0000 - 0x00007ff81016d000 C:\WINDOWS\System32\KERNEL32.DLL +0x00007ff80ee10000 - 0x00007ff80f0d8000 C:\WINDOWS\System32\KERNELBASE.dll +0x00007ff80ec60000 - 0x00007ff80ed60000 C:\WINDOWS\System32\ucrtbase.dll +0x00007fffeca90000 - 0x00007fffecaa9000 C:\Program Files\Android\Android Studio\jre\bin\jli.dll +0x00007fffecf50000 - 0x00007fffecf67000 C:\Program Files\Android\Android Studio\jre\bin\VCRUNTIME140.dll +0x00007ff80feb0000 - 0x00007ff810050000 C:\WINDOWS\System32\USER32.dll +0x00007ffffd860000 - 0x00007ffffdafa000 C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.844_none_ca00b6081b84eb1d\COMCTL32.dll +0x00007ff80f2e0000 - 0x00007ff80f302000 C:\WINDOWS\System32\win32u.dll +0x00007ff810790000 - 0x00007ff81082e000 C:\WINDOWS\System32\msvcrt.dll +0x00007ff810220000 - 0x00007ff81024a000 C:\WINDOWS\System32\GDI32.dll +0x00007ff80eb50000 - 0x00007ff80ec5b000 C:\WINDOWS\System32\gdi32full.dll +0x00007ff80f240000 - 0x00007ff80f2dd000 C:\WINDOWS\System32\msvcp_win.dll +0x00007ff80fe80000 - 0x00007ff80feb0000 C:\WINDOWS\System32\IMM32.DLL +0x00007fffea210000 - 0x00007fffea2ad000 C:\Program Files\Android\Android Studio\jre\bin\msvcp140.dll +0x00007fffbc3f0000 - 0x00007fffbceac000 C:\Program Files\Android\Android Studio\jre\bin\server\jvm.dll +0x00007ff8108d0000 - 0x00007ff81097c000 C:\WINDOWS\System32\ADVAPI32.dll +0x00007ff810830000 - 0x00007ff8108cb000 C:\WINDOWS\System32\sechost.dll +0x00007ff80f7a0000 - 0x00007ff80f8cb000 C:\WINDOWS\System32\RPCRT4.dll +0x00007ff80f410000 - 0x00007ff80f418000 C:\WINDOWS\System32\PSAPI.DLL +0x00007fffeaf90000 - 0x00007fffeaf99000 C:\WINDOWS\SYSTEM32\WSOCK32.dll +0x00007ff811150000 - 0x00007ff8111bb000 C:\WINDOWS\System32\WS2_32.dll +0x00007ff800610000 - 0x00007ff800637000 C:\WINDOWS\SYSTEM32\WINMM.dll +0x00007ff808930000 - 0x00007ff80893a000 C:\WINDOWS\SYSTEM32\VERSION.dll +0x00007ff80ca50000 - 0x00007ff80ca62000 C:\WINDOWS\SYSTEM32\kernel.appcore.dll +0x00007ff809a70000 - 0x00007ff809a81000 C:\Program Files\Android\Android Studio\jre\bin\verify.dll +0x00007ff807e20000 - 0x00007ff808004000 C:\WINDOWS\SYSTEM32\DBGHELP.DLL +0x00007ff807cb0000 - 0x00007ff807cdc000 C:\WINDOWS\SYSTEM32\dbgcore.DLL +0x00007ff80f340000 - 0x00007ff80f3c0000 C:\WINDOWS\System32\bcryptPrimitives.dll +0x00007ff802450000 - 0x00007ff802479000 C:\Program Files\Android\Android Studio\jre\bin\java.dll +0x00007ff8099f0000 - 0x00007ff8099fb000 C:\Program Files\Android\Android Studio\jre\bin\jimage.dll +0x00007ff800670000 - 0x00007ff800688000 C:\Program Files\Android\Android Studio\jre\bin\zip.dll +0x00007ff810980000 - 0x00007ff8110c2000 C:\WINDOWS\System32\SHELL32.dll +0x00007ff80cc50000 - 0x00007ff80d3e1000 C:\WINDOWS\SYSTEM32\windows.storage.dll +0x00007ff8103d0000 - 0x00007ff810725000 C:\WINDOWS\System32\combase.dll +0x00007ff80e560000 - 0x00007ff80e58c000 C:\WINDOWS\SYSTEM32\Wldp.dll +0x00007ff80f8d0000 - 0x00007ff80f97e000 C:\WINDOWS\System32\SHCORE.dll +0x00007ff810050000 - 0x00007ff8100a5000 C:\WINDOWS\System32\shlwapi.dll +0x00007ff80ea30000 - 0x00007ff80ea4f000 C:\WINDOWS\SYSTEM32\profapi.dll +0x00007ffff8030000 - 0x00007ffff804a000 C:\Program Files\Android\Android Studio\jre\bin\net.dll +0x00007ff804e70000 - 0x00007ff804f7b000 C:\WINDOWS\SYSTEM32\WINHTTP.dll +0x00007ff80e2d0000 - 0x00007ff80e33a000 C:\WINDOWS\system32\mswsock.dll +0x00007ffff0bc0000 - 0x00007ffff0bd4000 C:\Program Files\Android\Android Studio\jre\bin\nio.dll + +dbghelp: loaded successfully - version: 4.0.5 - missing functions: none +symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;C:\Program Files\Android\Android Studio\jre\bin;C:\WINDOWS\SYSTEM32;C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.844_none_ca00b6081b84eb1d;C:\Program Files\Android\Android Studio\jre\bin\server + +VM Arguments: +java_command: org.jetbrains.kotlin.cli.jvm.K2JVMCompiler @C:\Users\Schoumi\projet\peeriscope\app\build\20210505_14483671906268588073.compiler.options +java_class_path (initial): C:\Users\Schoumi\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-compiler-embeddable\1.5.0\6e53e0ca3cf7eff1a4df71171c8f9604b983e1d6\kotlin-compiler-embeddable-1.5.0.jar;C:\Users\Schoumi\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-reflect\1.5.0\47806fe8ed30dbdf9e697eda5e9c9a3905ff3363\kotlin-reflect-1.5.0.jar;C:\Users\Schoumi\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib\1.5.0\29dae2501ca094416d15af0e21470cb634780444\kotlin-stdlib-1.5.0.jar;C:\Users\Schoumi\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-script-runtime\1.5.0\a2d66828077376fc1851a6fdbf25865935f4101d\kotlin-script-runtime-1.5.0.jar;C:\Users\Schoumi\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-daemon-embeddable\1.5.0\7f3567acfef59ff865a99a584d814bde87226dd5\kotlin-daemon-embeddable-1.5.0.jar;C:\Users\Schoumi\.gradle\caches\modules-2\files-2.1\org.jetbrains.intellij.deps\trove4j\1.0.20181211\216c2e14b070f334479d800987affe4054cd563f\trove4j-1.0.20181211.jar;C:\Users\Schoumi\.gradle\caches\modules-2\files-2.1\org.jetbrains\annotations\13.0\919f0dfe192fb4e063e7dacadee7f8bb9a2672a9\annotations-13.0.jar;C:\Users\Schoumi\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-common\1.5.0\4080d69efca5e39e9b4972f125e40f1607bd6460\kotlin-stdlib-common-1.5.0.jar +Launcher Type: SUN_STANDARD + +[Global flags] + intx CICompilerCount = 3 {product} {ergonomic} + uint ConcGCThreads = 1 {product} {ergonomic} + uint G1ConcRefinementThreads = 4 {product} {ergonomic} + size_t G1HeapRegionSize = 1048576 {product} {ergonomic} + uintx GCDrainStackTargetSize = 64 {product} {ergonomic} + size_t InitialHeapSize = 402653184 {product} {ergonomic} + size_t MarkStackSize = 4194304 {product} {ergonomic} + size_t MaxHeapSize = 6423576576 {product} {ergonomic} + size_t MaxNewSize = 3853516800 {product} {ergonomic} + size_t MinHeapDeltaBytes = 1048576 {product} {ergonomic} + uintx NonNMethodCodeHeapSize = 5830732 {pd product} {ergonomic} + uintx NonProfiledCodeHeapSize = 122913754 {pd product} {ergonomic} + uintx ProfiledCodeHeapSize = 122913754 {pd product} {ergonomic} + uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} + bool SegmentedCodeCache = true {product} {ergonomic} + bool UseCompressedClassPointers = true {lp64_product} {ergonomic} + bool UseCompressedOops = true {lp64_product} {ergonomic} + bool UseG1GC = true {product} {ergonomic} + bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic} + +Logging: +Log output configuration: + #0: stdout all=warning uptime,level,tags + #1: stderr all=off uptime,level,tags + +Environment Variables: +PATH=C:\Program Files\ImageMagick-7.0.10-Q16-HDRI;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\CMake\bin;C:\Users\Schoumi\AppData\Local\Mu\bin;C:\Users\Schoumi\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Git\bin;C:\Program Files\Java\jdk1.8.0_172\bin;C:\Program Files\ldlc\gradle-4.7\bin;C:\Users\Schoumi\AppData\Local\Programs\Microsoft VS Code\bin +USERNAME=Schoumi +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 94 Stepping 3, GenuineIntel + + + +--------------- S Y S T E M --------------- + +OS: Windows 10 , 64 bit Build 19041 (10.0.19041.928) +OS uptime: 15 days 5:14 hours + +CPU:total 4 (initial active 4) (4 cores per cpu, 1 threads per core) family 6 model 94 stepping 3, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, avx, avx2, aes, clmul, erms, 3dnowpref, lzcnt, tsc, tscinvbit, bmi1, bmi2, adx, fma + +Memory: 4k page, system-wide physical 24501M (6459M free) +TotalPageFile size 52981M (AvailPageFile size 5M) +current process WorkingSet (physical memory assigned to process): 342M, peak: 342M +current process commit charge ("private bytes"): 602M, peak: 609M + +vm_info: OpenJDK 64-Bit Server VM (11.0.8+10-b944.6842174) for windows-amd64 JRE (11.0.8+10-b944.6842174), built on Sep 19 2020 01:11:42 by "builder" with MS VC++ 14.0 (VS2015) + +END. diff --git a/hs_err_pid98396.log b/hs_err_pid98396.log new file mode 100644 index 0000000..d06403f --- /dev/null +++ b/hs_err_pid98396.log @@ -0,0 +1,1101 @@ +# +# There is insufficient memory for the Java Runtime Environment to continue. +# Native memory allocation (mmap) failed to map 70254592 bytes for Failed to commit area from 0x0000000098000000 to 0x000000009c300000 of length 70254592. +# Possible reasons: +# The system is out of physical RAM or swap space +# The process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap +# Possible solutions: +# Reduce memory load on the system +# Increase physical memory or swap space +# Check if swap backing store is full +# Decrease Java heap size (-Xmx/-Xms) +# Decrease number of Java threads +# Decrease Java thread stack sizes (-Xss) +# Set larger code cache with -XX:ReservedCodeCacheSize= +# JVM is running with Unscaled Compressed Oops mode in which the Java heap is +# placed in the first 4GB address space. The Java Heap base address is the +# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress +# to set the Java Heap base and to place the Java Heap above 4GB virtual address. +# This output file may be truncated or incomplete. +# +# Out of Memory Error (./src/hotspot/os/windows/os_windows.cpp:3303), pid=98396, tid=98712 +# +# JRE version: OpenJDK Runtime Environment (11.0.8+10) (build 11.0.8+10-b944.6842174) +# Java VM: OpenJDK 64-Bit Server VM (11.0.8+10-b944.6842174, mixed mode, tiered, compressed oops, g1 gc, windows-amd64) +# No core dump will be written. Minidumps are not enabled by default on client versions of Windows +# + +--------------- S U M M A R Y ------------ + +Command Line: --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED -Xmx2048m -Dfile.encoding=windows-1252 -Duser.country=FR -Duser.language=fr -Duser.variant org.gradle.launcher.daemon.bootstrap.GradleDaemon 6.7.1 + +Host: Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz, 4 cores, 23G, Windows 10 , 64 bit Build 19041 (10.0.19041.928) +Time: Wed May 5 15:51:23 2021 Paris, Madrid (heure d’été) elapsed time: 658 seconds (0d 0h 10m 58s) + +--------------- T H R E A D --------------- + +Current thread (0x000001c7dba75000): VMThread "VM Thread" [stack: 0x00000014cd200000,0x00000014cd300000] [id=98712] + +Stack: [0x00000014cd200000,0x00000014cd300000] +[error occurred during error reporting (printing stack bounds), id 0xc0000005, EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000001c7c4960dad] + +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +V [jvm.dll+0x5de50a] +V [jvm.dll+0x7122f5] +V [jvm.dll+0x71384d] +V [jvm.dll+0x713e65] +V [jvm.dll+0x713e1b] +V [jvm.dll+0x5dd958] +V [jvm.dll+0x5de0f8] +C [ntdll.dll+0xa207f] +C [ntdll.dll+0x51454] +C [ntdll.dll+0xa0bae] +C 0x000001c7c4960dad + +VM_Operation (0x00000014ce7fed70): G1CollectForAllocation, mode: safepoint, requested by thread 0x000001c788f73000 + + +--------------- P R O C E S S --------------- + +Threads class SMR info: +_java_thread_list=0x000001c781072a80, length=173, elements={ +0x000001c7c0fda800, 0x000001c7db1b9000, 0x000001c7db1ba000, 0x000001c7dbac2800, +0x000001c7dbac5000, 0x000001c7dbac7000, 0x000001c7dbacf800, 0x000001c7dbad0800, +0x000001c7dbc3b000, 0x000001c7dbc5c000, 0x000001c7dde9c800, 0x000001c7dbfc1000, +0x000001c7ddf4f800, 0x000001c7dd356800, 0x000001c7dd354800, 0x000001c7dd354000, +0x000001c7dfc05800, 0x000001c7dfc06000, 0x000001c7fbf3a000, 0x000001c7f0aa2000, +0x000001c7f0aa0000, 0x000001c7e09f7800, 0x000001c7f0a9e000, 0x000001c7f0aa5000, +0x000001c7e09f2800, 0x000001c788f77000, 0x000001c788f76800, 0x000001c788f72800, +0x000001c788f75800, 0x000001c788f79000, 0x000001c788f73000, 0x000001c788f79800, +0x000001c788f75000, 0x000001c788f74000, 0x000001c788f7c000, 0x000001c788f7d000, +0x000001c788f7e000, 0x000001c788f7e800, 0x000001c788f7b800, 0x000001c788f7a800, +0x000001c788f7f800, 0x000001c788f84800, 0x000001c788f85000, 0x000001c788f82000, +0x000001c788f86000, 0x000001c788f81000, 0x000001c788f86800, 0x000001c788f87800, +0x000001c788f88800, 0x000001c788f82800, 0x000001c788f89000, 0x000001c788f83800, +0x000001c788f8e000, 0x000001c788f8b000, 0x000001c788f8f000, 0x000001c788f8b800, +0x000001c788f8f800, 0x000001c788f8a000, 0x000001c788f8c800, 0x000001c788f90800, +0x000001c788f8d800, 0x000001c788f91800, 0x000001c788f92000, 0x000001c78e5d1800, +0x000001c78e5d2000, 0x000001c78e5d3800, 0x000001c78e5ce000, 0x000001c78e5d4800, +0x000001c78e5cf000, 0x000001c78e5d5800, 0x000001c78e5cf800, 0x000001c78e5d0800, +0x000001c78e5d8800, 0x000001c78e5d7000, 0x000001c78e5da800, 0x000001c78e5d8000, +0x000001c78e5d9800, 0x000001c78e5db000, 0x000001c78e5dc000, 0x000001c78e5d6000, +0x000001c78e5dc800, 0x000001c78cb07800, 0x000001c78cb04000, 0x000001c78cb05000, +0x000001c78cb05800, 0x000001c78cb08000, 0x000001c78cb09000, 0x000001c78cb06800, +0x000001c78cb03800, 0x000001c78cb0a800, 0x000001c78cb0c800, 0x000001c78cb0e000, +0x000001c78cb0a000, 0x000001c78cb10800, 0x000001c78cb11000, 0x000001c78cb0b800, +0x000001c78cb12000, 0x000001c78cb0d000, 0x000001c7fbf38800, 0x000001c7fbf3d000, +0x000001c7fbf39000, 0x000001c7fbf3f000, 0x000001c7fbf3f800, 0x000001c7fbf3a800, +0x000001c7fbf40800, 0x000001c7fbf3c800, 0x000001c7fbf41800, 0x000001c7fbf3e000, +0x000001c7fbf3b800, 0x000001c7fbf46000, 0x000001c7fbf44800, 0x000001c7fbf42000, +0x000001c7fbf45800, 0x000001c7fbf47000, 0x000001c7f0aa1000, 0x000001c7f0a9c000, +0x000001c7f0aa2800, 0x000001c7f0a9d000, 0x000001c7f0a9e800, 0x000001c7f0a9f800, +0x000001c7f0aa4800, 0x000001c7f0aa3800, 0x000001c7f0aa7800, 0x000001c7f0aaa000, +0x000001c7f0aa6000, 0x000001c7f0aa8800, 0x000001c7f0aa9000, 0x000001c7f0aa7000, +0x000001c7f0aab000, 0x000001c7dfc02000, 0x000001c7dfc07000, 0x000001c7dfc08000, +0x000001c7dfc09800, 0x000001c7dfc08800, 0x000001c7dfc0a800, 0x000001c7dfc04800, +0x000001c7dfc11000, 0x000001c7dfc0e800, 0x000001c7dfc10000, 0x000001c7dfc0f000, +0x000001c7dfc0c800, 0x000001c7dfc0b000, 0x000001c7dfc0d800, 0x000001c7dfc0c000, +0x000001c7e09f6000, 0x000001c7e09f4800, 0x000001c7e09f0800, 0x000001c7e09f1000, +0x000001c7e09f7000, 0x000001c7e09f2000, 0x000001c7e09fb000, 0x000001c7e09f8800, +0x000001c7e09fe000, 0x000001c7e09ff000, 0x000001c7e09f9800, 0x000001c7e09fa000, +0x000001c7dd357000, 0x000001c7dd359000, 0x000001c7dd355800, 0x000001c7dd358000, +0x000001c7dd359800, 0x000001c7dd35a800, 0x000001c7ee998800, 0x000001c7ee99a000, +0x000001c7ee99a800, 0x000001c7ee99b800, 0x000001c7ee99c800, 0x000001c7ee99d000, +0x000001c7ee99e000, 0x000001c7ee99f000, 0x000001c7ee9a2000, 0x000001c7ee9a5800, +0x000001c7ee9a0800 +} + +Java Threads: ( => current thread ) + 0x000001c7c0fda800 JavaThread "main" [_thread_blocked, id=99184, stack(0x00000014ccc00000,0x00000014ccd00000)] + 0x000001c7db1b9000 JavaThread "Reference Handler" daemon [_thread_blocked, id=94816, stack(0x00000014cd300000,0x00000014cd400000)] + 0x000001c7db1ba000 JavaThread "Finalizer" daemon [_thread_blocked, id=2808, stack(0x00000014cd400000,0x00000014cd500000)] + 0x000001c7dbac2800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=99392, stack(0x00000014cd500000,0x00000014cd600000)] + 0x000001c7dbac5000 JavaThread "Attach Listener" daemon [_thread_blocked, id=99828, stack(0x00000014cd600000,0x00000014cd700000)] + 0x000001c7dbac7000 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=97928, stack(0x00000014cd700000,0x00000014cd800000)] + 0x000001c7dbacf800 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=96792, stack(0x00000014cd800000,0x00000014cd900000)] + 0x000001c7dbad0800 JavaThread "Sweeper thread" daemon [_thread_blocked, id=99468, stack(0x00000014cd900000,0x00000014cda00000)] + 0x000001c7dbc3b000 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=93464, stack(0x00000014cda00000,0x00000014cdb00000)] + 0x000001c7dbc5c000 JavaThread "Service Thread" daemon [_thread_blocked, id=3752, stack(0x00000014cdb00000,0x00000014cdc00000)] + 0x000001c7dde9c800 JavaThread "Daemon health stats" [_thread_blocked, id=99092, stack(0x00000014ce200000,0x00000014ce300000)] + 0x000001c7dbfc1000 JavaThread "Incoming local TCP Connector on port 52492" [_thread_in_native, id=88388, stack(0x00000014ce400000,0x00000014ce500000)] + 0x000001c7ddf4f800 JavaThread "Daemon periodic checks" [_thread_blocked, id=98456, stack(0x00000014ce500000,0x00000014ce600000)] + 0x000001c7dd356800 JavaThread "Cache worker for file hash cache (C:\Users\Schoumi\.gradle\caches\6.7.1\fileHashes)" [_thread_blocked, id=99240, stack(0x00000014cee00000,0x00000014cef00000)] + 0x000001c7dd354800 JavaThread "File lock request listener" [_thread_in_native, id=100324, stack(0x00000014cef00000,0x00000014cf000000)] + 0x000001c7dd354000 JavaThread "Cache worker for journal cache (C:\Users\Schoumi\.gradle\caches\journal-1)" [_thread_blocked, id=97532, stack(0x00000014cf000000,0x00000014cf100000)] + 0x000001c7dfc05800 JavaThread "Cache worker for execution history cache (C:\Users\Schoumi\.gradle\caches\6.7.1\executionHistory)" [_thread_blocked, id=100092, stack(0x00000014d0a00000,0x00000014d0b00000)] + 0x000001c7dfc06000 JavaThread "Cache worker for file content cache (C:\Users\Schoumi\.gradle\caches\6.7.1\fileContent)" [_thread_blocked, id=10120, stack(0x00000014d0600000,0x00000014d0700000)] + 0x000001c7fbf3a000 JavaThread "Memory manager" [_thread_blocked, id=8200, stack(0x00000014d7900000,0x00000014d7a00000)] + 0x000001c7f0aa2000 JavaThread "Daemon Thread 3" [_thread_blocked, id=10316, stack(0x00000014cc900000,0x00000014cca00000)] + 0x000001c7f0aa0000 JavaThread "Daemon worker Thread 3" [_thread_blocked, id=97792, stack(0x00000014ce600000,0x00000014ce700000)] + 0x000001c7e09f7800 JavaThread "Cache worker for Java compile cache (C:\Users\Schoumi\.gradle\caches\6.7.1\javaCompile)" [_thread_blocked, id=100172, stack(0x00000014ceb00000,0x00000014cec00000)] + 0x000001c7f0a9e000 JavaThread "RMI Scheduler(0)" daemon [_thread_blocked, id=12520, stack(0x00000014d8100000,0x00000014d8200000)] + 0x000001c7f0aa5000 JavaThread "RMI RenewClean-[127.0.0.1:17345,org.jetbrains.kotlin.daemon.common.LoopbackNetworkInterface$ClientLoopbackSocketFactory@669a75c5]" daemon [_thread_blocked, id=97588, stack(0x00000014d8800000,0x00000014d8900000)] + 0x000001c7e09f2800 JavaThread "RMI GC Daemon" daemon [_thread_blocked, id=97060, stack(0x00000014d8900000,0x00000014d8a00000)] + 0x000001c788f77000 JavaThread "RMI TCP Accept-0" daemon [_thread_in_native, id=97820, stack(0x00000014d8a00000,0x00000014d8b00000)] + 0x000001c788f76800 JavaThread "RMI Reaper" [_thread_blocked, id=99364, stack(0x00000014d8b00000,0x00000014d8c00000)] + 0x000001c788f72800 JavaThread "RMI TCP Connection(2)-127.0.0.1" daemon [_thread_in_native, id=50736, stack(0x00000014d8d00000,0x00000014d8e00000)] + 0x000001c788f75800 JavaThread "Handler for socket connection from /127.0.0.1:52492 to /127.0.0.1:52822" [_thread_in_native, id=96912, stack(0x00000014cca00000,0x00000014ccb00000)] + 0x000001c788f79000 JavaThread "Cancel handler" [_thread_blocked, id=94612, stack(0x00000014ccb00000,0x00000014ccc00000)] + 0x000001c788f73000 JavaThread "Asynchronous log dispatcher for DefaultDaemonConnection: socket connection from /127.0.0.1:52492 to /127.0.0.1:52822" [_thread_blocked, id=13468, stack(0x00000014ce700000,0x00000014ce800000)] + 0x000001c788f79800 JavaThread "Stdin handler" [_thread_blocked, id=13716, stack(0x00000014ce800000,0x00000014ce900000)] + 0x000001c788f75000 JavaThread "Thread-724" [_thread_blocked, id=96648, stack(0x00000014ce900000,0x00000014cea00000)] + 0x000001c788f74000 JavaThread "Cache worker for file hash cache (C:\Users\Schoumi\projet\peeriscope\.gradle\6.7.1\fileHashes)" [_thread_blocked, id=1160, stack(0x00000014cea00000,0x00000014ceb00000)] + 0x000001c788f7c000 JavaThread "Cache worker for checksums cache (C:\Users\Schoumi\projet\peeriscope\.gradle\checksums)" [_thread_blocked, id=2912, stack(0x00000014cec00000,0x00000014ced00000)] + 0x000001c788f7d000 JavaThread "Cache worker for cache directory md-supplier (C:\Users\Schoumi\.gradle\caches\6.7.1\md-supplier)" [_thread_blocked, id=93644, stack(0x00000014ced00000,0x00000014cee00000)] + 0x000001c788f7e000 JavaThread "Cache worker for cache directory md-rule (C:\Users\Schoumi\.gradle\caches\6.7.1\md-rule)" [_thread_blocked, id=93788, stack(0x00000014cf100000,0x00000014cf200000)] + 0x000001c788f7e800 JavaThread "Cache worker for Build Output Cleanup Cache (C:\Users\Schoumi\projet\peeriscope\.gradle\buildOutputCleanup)" [_thread_blocked, id=14892, stack(0x00000014cf200000,0x00000014cf300000)] + 0x000001c788f7b800 JavaThread "Build operations" [_thread_blocked, id=100232, stack(0x00000014cf400000,0x00000014cf500000)] + 0x000001c788f7a800 JavaThread "Build operations Thread 2" [_thread_blocked, id=4628, stack(0x00000014cf500000,0x00000014cf600000)] + 0x000001c788f7f800 JavaThread "Build operations Thread 3" [_thread_blocked, id=90716, stack(0x00000014cf600000,0x00000014cf700000)] + 0x000001c788f84800 JavaThread "Build operations Thread 4" [_thread_blocked, id=100292, stack(0x00000014cf700000,0x00000014cf800000)] + 0x000001c788f85000 JavaThread "jar transforms Thread 601" [_thread_blocked, id=98872, stack(0x00000014cf800000,0x00000014cf900000)] + 0x000001c788f82000 JavaThread "jar transforms Thread 602" [_thread_blocked, id=98744, stack(0x00000014cf900000,0x00000014cfa00000)] + 0x000001c788f86000 JavaThread "jar transforms Thread 603" [_thread_blocked, id=96412, stack(0x00000014cfa00000,0x00000014cfb00000)] + 0x000001c788f81000 JavaThread "jar transforms Thread 604" [_thread_blocked, id=98340, stack(0x00000014cfb00000,0x00000014cfc00000)] + 0x000001c788f86800 JavaThread "jar transforms Thread 605" [_thread_blocked, id=98648, stack(0x00000014cfc00000,0x00000014cfd00000)] + 0x000001c788f87800 JavaThread "jar transforms Thread 606" [_thread_blocked, id=7284, stack(0x00000014cfd00000,0x00000014cfe00000)] + 0x000001c788f88800 JavaThread "jar transforms Thread 607" [_thread_blocked, id=96504, stack(0x00000014cfe00000,0x00000014cff00000)] + 0x000001c788f82800 JavaThread "jar transforms Thread 608" [_thread_blocked, id=93600, stack(0x00000014cff00000,0x00000014d0000000)] + 0x000001c788f89000 JavaThread "jar transforms Thread 609" [_thread_blocked, id=100152, stack(0x00000014d0000000,0x00000014d0100000)] + 0x000001c788f83800 JavaThread "jar transforms Thread 610" [_thread_blocked, id=67868, stack(0x00000014d0100000,0x00000014d0200000)] + 0x000001c788f8e000 JavaThread "jar transforms Thread 611" [_thread_blocked, id=94452, stack(0x00000014d0200000,0x00000014d0300000)] + 0x000001c788f8b000 JavaThread "jar transforms Thread 612" [_thread_blocked, id=96512, stack(0x00000014d0300000,0x00000014d0400000)] + 0x000001c788f8f000 JavaThread "jar transforms Thread 613" [_thread_blocked, id=96848, stack(0x00000014d0400000,0x00000014d0500000)] + 0x000001c788f8b800 JavaThread "jar transforms Thread 614" [_thread_blocked, id=100032, stack(0x00000014d0500000,0x00000014d0600000)] + 0x000001c788f8f800 JavaThread "jar transforms Thread 615" [_thread_blocked, id=99192, stack(0x00000014d0700000,0x00000014d0800000)] + 0x000001c788f8a000 JavaThread "jar transforms Thread 616" [_thread_blocked, id=98104, stack(0x00000014d0800000,0x00000014d0900000)] + 0x000001c788f8c800 JavaThread "jar transforms Thread 617" [_thread_blocked, id=98184, stack(0x00000014d0900000,0x00000014d0a00000)] + 0x000001c788f90800 JavaThread "jar transforms Thread 618" [_thread_blocked, id=12648, stack(0x00000014d0d00000,0x00000014d0e00000)] + 0x000001c788f8d800 JavaThread "jar transforms Thread 619" [_thread_blocked, id=97308, stack(0x00000014d0e00000,0x00000014d0f00000)] + 0x000001c788f91800 JavaThread "jar transforms Thread 620" [_thread_blocked, id=16156, stack(0x00000014d1000000,0x00000014d1100000)] + 0x000001c788f92000 JavaThread "jar transforms Thread 621" [_thread_blocked, id=99688, stack(0x00000014d1100000,0x00000014d1200000)] + 0x000001c78e5d1800 JavaThread "jar transforms Thread 622" [_thread_blocked, id=97908, stack(0x00000014d1200000,0x00000014d1300000)] + 0x000001c78e5d2000 JavaThread "jar transforms Thread 623" [_thread_blocked, id=98624, stack(0x00000014d1300000,0x00000014d1400000)] + 0x000001c78e5d3800 JavaThread "jar transforms Thread 624" [_thread_blocked, id=12544, stack(0x00000014d1400000,0x00000014d1500000)] + 0x000001c78e5ce000 JavaThread "jar transforms Thread 625" [_thread_blocked, id=97672, stack(0x00000014d1500000,0x00000014d1600000)] + 0x000001c78e5d4800 JavaThread "jar transforms Thread 626" [_thread_blocked, id=14304, stack(0x00000014d1600000,0x00000014d1700000)] + 0x000001c78e5cf000 JavaThread "jar transforms Thread 627" [_thread_blocked, id=1468, stack(0x00000014d1700000,0x00000014d1800000)] + 0x000001c78e5d5800 JavaThread "jar transforms Thread 628" [_thread_blocked, id=97552, stack(0x00000014d1800000,0x00000014d1900000)] + 0x000001c78e5cf800 JavaThread "jar transforms Thread 629" [_thread_blocked, id=84580, stack(0x00000014d1900000,0x00000014d1a00000)] + 0x000001c78e5d0800 JavaThread "jar transforms Thread 630" [_thread_blocked, id=12196, stack(0x00000014d1a00000,0x00000014d1b00000)] + 0x000001c78e5d8800 JavaThread "jar transforms Thread 631" [_thread_blocked, id=9624, stack(0x00000014d1b00000,0x00000014d1c00000)] + 0x000001c78e5d7000 JavaThread "jar transforms Thread 632" [_thread_blocked, id=99096, stack(0x00000014d1c00000,0x00000014d1d00000)] + 0x000001c78e5da800 JavaThread "jar transforms Thread 633" [_thread_blocked, id=99180, stack(0x00000014d1d00000,0x00000014d1e00000)] + 0x000001c78e5d8000 JavaThread "jar transforms Thread 634" [_thread_blocked, id=97804, stack(0x00000014d1e00000,0x00000014d1f00000)] + 0x000001c78e5d9800 JavaThread "jar transforms Thread 635" [_thread_blocked, id=99084, stack(0x00000014d1f00000,0x00000014d2000000)] + 0x000001c78e5db000 JavaThread "jar transforms Thread 636" [_thread_blocked, id=15948, stack(0x00000014d2000000,0x00000014d2100000)] + 0x000001c78e5dc000 JavaThread "jar transforms Thread 637" [_thread_blocked, id=96808, stack(0x00000014d2100000,0x00000014d2200000)] + 0x000001c78e5d6000 JavaThread "jar transforms Thread 638" [_thread_blocked, id=96624, stack(0x00000014d2200000,0x00000014d2300000)] + 0x000001c78e5dc800 JavaThread "jar transforms Thread 639" [_thread_blocked, id=99032, stack(0x00000014d2300000,0x00000014d2400000)] + 0x000001c78cb07800 JavaThread "jar transforms Thread 640" [_thread_blocked, id=96384, stack(0x00000014d2400000,0x00000014d2500000)] + 0x000001c78cb04000 JavaThread "jar transforms Thread 641" [_thread_blocked, id=97612, stack(0x00000014d2500000,0x00000014d2600000)] + 0x000001c78cb05000 JavaThread "jar transforms Thread 642" [_thread_blocked, id=99652, stack(0x00000014d2600000,0x00000014d2700000)] + 0x000001c78cb05800 JavaThread "jar transforms Thread 643" [_thread_blocked, id=98868, stack(0x00000014d2700000,0x00000014d2800000)] + 0x000001c78cb08000 JavaThread "jar transforms Thread 644" [_thread_blocked, id=18012, stack(0x00000014d2800000,0x00000014d2900000)] + 0x000001c78cb09000 JavaThread "jar transforms Thread 645" [_thread_blocked, id=1864, stack(0x00000014d2900000,0x00000014d2a00000)] + 0x000001c78cb06800 JavaThread "jar transforms Thread 646" [_thread_blocked, id=93368, stack(0x00000014d2a00000,0x00000014d2b00000)] + 0x000001c78cb03800 JavaThread "jar transforms Thread 647" [_thread_blocked, id=10388, stack(0x00000014d2b00000,0x00000014d2c00000)] + 0x000001c78cb0a800 JavaThread "jar transforms Thread 648" [_thread_blocked, id=95996, stack(0x00000014d2c00000,0x00000014d2d00000)] + 0x000001c78cb0c800 JavaThread "jar transforms Thread 649" [_thread_blocked, id=96772, stack(0x00000014d2d00000,0x00000014d2e00000)] + 0x000001c78cb0e000 JavaThread "jar transforms Thread 650" [_thread_blocked, id=97324, stack(0x00000014d2e00000,0x00000014d2f00000)] + 0x000001c78cb0a000 JavaThread "jar transforms Thread 651" [_thread_blocked, id=100188, stack(0x00000014d2f00000,0x00000014d3000000)] + 0x000001c78cb10800 JavaThread "jar transforms Thread 652" [_thread_blocked, id=100072, stack(0x00000014d3000000,0x00000014d3100000)] + 0x000001c78cb11000 JavaThread "jar transforms Thread 653" [_thread_blocked, id=97164, stack(0x00000014d3100000,0x00000014d3200000)] + 0x000001c78cb0b800 JavaThread "jar transforms Thread 654" [_thread_blocked, id=15212, stack(0x00000014d3200000,0x00000014d3300000)] + 0x000001c78cb12000 JavaThread "jar transforms Thread 655" [_thread_blocked, id=97980, stack(0x00000014d3300000,0x00000014d3400000)] + 0x000001c78cb0d000 JavaThread "jar transforms Thread 656" [_thread_blocked, id=99936, stack(0x00000014d3400000,0x00000014d3500000)] + 0x000001c7fbf38800 JavaThread "jar transforms Thread 657" [_thread_blocked, id=97988, stack(0x00000014d3500000,0x00000014d3600000)] + 0x000001c7fbf3d000 JavaThread "jar transforms Thread 658" [_thread_blocked, id=99252, stack(0x00000014d3600000,0x00000014d3700000)] + 0x000001c7fbf39000 JavaThread "jar transforms Thread 659" [_thread_blocked, id=90268, stack(0x00000014d3700000,0x00000014d3800000)] + 0x000001c7fbf3f000 JavaThread "jar transforms Thread 660" [_thread_blocked, id=97784, stack(0x00000014d3800000,0x00000014d3900000)] + 0x000001c7fbf3f800 JavaThread "jar transforms Thread 661" [_thread_blocked, id=76540, stack(0x00000014d3900000,0x00000014d3a00000)] + 0x000001c7fbf3a800 JavaThread "jar transforms Thread 662" [_thread_blocked, id=96720, stack(0x00000014d3a00000,0x00000014d3b00000)] + 0x000001c7fbf40800 JavaThread "jar transforms Thread 663" [_thread_blocked, id=99404, stack(0x00000014d3b00000,0x00000014d3c00000)] + 0x000001c7fbf3c800 JavaThread "jar transforms Thread 664" [_thread_blocked, id=98676, stack(0x00000014d3c00000,0x00000014d3d00000)] + 0x000001c7fbf41800 JavaThread "jar transforms Thread 665" [_thread_blocked, id=15952, stack(0x00000014d3d00000,0x00000014d3e00000)] + 0x000001c7fbf3e000 JavaThread "jar transforms Thread 666" [_thread_blocked, id=13420, stack(0x00000014d3e00000,0x00000014d3f00000)] + 0x000001c7fbf3b800 JavaThread "jar transforms Thread 667" [_thread_blocked, id=100012, stack(0x00000014d3f00000,0x00000014d4000000)] + 0x000001c7fbf46000 JavaThread "jar transforms Thread 668" [_thread_blocked, id=98828, stack(0x00000014d4000000,0x00000014d4100000)] + 0x000001c7fbf44800 JavaThread "jar transforms Thread 669" [_thread_blocked, id=96844, stack(0x00000014d4100000,0x00000014d4200000)] + 0x000001c7fbf42000 JavaThread "jar transforms Thread 670" [_thread_blocked, id=5736, stack(0x00000014d4200000,0x00000014d4300000)] + 0x000001c7fbf45800 JavaThread "jar transforms Thread 671" [_thread_blocked, id=13836, stack(0x00000014d4300000,0x00000014d4400000)] + 0x000001c7fbf47000 JavaThread "jar transforms Thread 672" [_thread_blocked, id=92384, stack(0x00000014d4400000,0x00000014d4500000)] + 0x000001c7f0aa1000 JavaThread "jar transforms Thread 673" [_thread_blocked, id=12756, stack(0x00000014d4500000,0x00000014d4600000)] + 0x000001c7f0a9c000 JavaThread "jar transforms Thread 674" [_thread_blocked, id=100016, stack(0x00000014d4600000,0x00000014d4700000)] + 0x000001c7f0aa2800 JavaThread "jar transforms Thread 675" [_thread_blocked, id=99000, stack(0x00000014d4700000,0x00000014d4800000)] + 0x000001c7f0a9d000 JavaThread "jar transforms Thread 676" [_thread_blocked, id=97632, stack(0x00000014d4800000,0x00000014d4900000)] + 0x000001c7f0a9e800 JavaThread "jar transforms Thread 677" [_thread_blocked, id=96776, stack(0x00000014d4900000,0x00000014d4a00000)] + 0x000001c7f0a9f800 JavaThread "jar transforms Thread 678" [_thread_blocked, id=98360, stack(0x00000014d4a00000,0x00000014d4b00000)] + 0x000001c7f0aa4800 JavaThread "jar transforms Thread 679" [_thread_blocked, id=97664, stack(0x00000014d4b00000,0x00000014d4c00000)] + 0x000001c7f0aa3800 JavaThread "jar transforms Thread 680" [_thread_blocked, id=15304, stack(0x00000014d4c00000,0x00000014d4d00000)] + 0x000001c7f0aa7800 JavaThread "jar transforms Thread 681" [_thread_blocked, id=98084, stack(0x00000014d4d00000,0x00000014d4e00000)] + 0x000001c7f0aaa000 JavaThread "jar transforms Thread 682" [_thread_blocked, id=97136, stack(0x00000014d4e00000,0x00000014d4f00000)] + 0x000001c7f0aa6000 JavaThread "jar transforms Thread 683" [_thread_blocked, id=99248, stack(0x00000014d4f00000,0x00000014d5000000)] + 0x000001c7f0aa8800 JavaThread "jar transforms Thread 684" [_thread_blocked, id=97996, stack(0x00000014d5000000,0x00000014d5100000)] + 0x000001c7f0aa9000 JavaThread "jar transforms Thread 685" [_thread_blocked, id=96984, stack(0x00000014d5100000,0x00000014d5200000)] + 0x000001c7f0aa7000 JavaThread "jar transforms Thread 686" [_thread_blocked, id=99264, stack(0x00000014d5200000,0x00000014d5300000)] + 0x000001c7f0aab000 JavaThread "jar transforms Thread 687" [_thread_blocked, id=12952, stack(0x00000014d5300000,0x00000014d5400000)] + 0x000001c7dfc02000 JavaThread "jar transforms Thread 688" [_thread_blocked, id=96524, stack(0x00000014d5400000,0x00000014d5500000)] + 0x000001c7dfc07000 JavaThread "jar transforms Thread 689" [_thread_blocked, id=55944, stack(0x00000014d5500000,0x00000014d5600000)] + 0x000001c7dfc08000 JavaThread "jar transforms Thread 690" [_thread_blocked, id=99560, stack(0x00000014d5600000,0x00000014d5700000)] + 0x000001c7dfc09800 JavaThread "jar transforms Thread 691" [_thread_blocked, id=98208, stack(0x00000014d5700000,0x00000014d5800000)] + 0x000001c7dfc08800 JavaThread "jar transforms Thread 692" [_thread_blocked, id=6428, stack(0x00000014d5800000,0x00000014d5900000)] + 0x000001c7dfc0a800 JavaThread "jar transforms Thread 693" [_thread_blocked, id=14276, stack(0x00000014d5900000,0x00000014d5a00000)] + 0x000001c7dfc04800 JavaThread "jar transforms Thread 694" [_thread_blocked, id=99552, stack(0x00000014d5a00000,0x00000014d5b00000)] + 0x000001c7dfc11000 JavaThread "jar transforms Thread 695" [_thread_blocked, id=96484, stack(0x00000014d5b00000,0x00000014d5c00000)] + 0x000001c7dfc0e800 JavaThread "jar transforms Thread 696" [_thread_blocked, id=98284, stack(0x00000014d5c00000,0x00000014d5d00000)] + 0x000001c7dfc10000 JavaThread "jar transforms Thread 697" [_thread_blocked, id=99644, stack(0x00000014d5d00000,0x00000014d5e00000)] + 0x000001c7dfc0f000 JavaThread "jar transforms Thread 698" [_thread_blocked, id=52864, stack(0x00000014d5e00000,0x00000014d5f00000)] + 0x000001c7dfc0c800 JavaThread "jar transforms Thread 699" [_thread_blocked, id=98608, stack(0x00000014d5f00000,0x00000014d6000000)] + 0x000001c7dfc0b000 JavaThread "jar transforms Thread 700" [_thread_blocked, id=100088, stack(0x00000014d6000000,0x00000014d6100000)] + 0x000001c7dfc0d800 JavaThread "jar transforms Thread 701" [_thread_blocked, id=99024, stack(0x00000014d6100000,0x00000014d6200000)] + 0x000001c7dfc0c000 JavaThread "jar transforms Thread 702" [_thread_blocked, id=99460, stack(0x00000014d6200000,0x00000014d6300000)] + 0x000001c7e09f6000 JavaThread "jar transforms Thread 703" [_thread_blocked, id=97204, stack(0x00000014d6300000,0x00000014d6400000)] + 0x000001c7e09f4800 JavaThread "jar transforms Thread 704" [_thread_blocked, id=100304, stack(0x00000014d6400000,0x00000014d6500000)] + 0x000001c7e09f0800 JavaThread "jar transforms Thread 705" [_thread_blocked, id=95776, stack(0x00000014d6500000,0x00000014d6600000)] + 0x000001c7e09f1000 JavaThread "jar transforms Thread 706" [_thread_blocked, id=94596, stack(0x00000014d6600000,0x00000014d6700000)] + 0x000001c7e09f7000 JavaThread "jar transforms Thread 707" [_thread_blocked, id=98856, stack(0x00000014d6700000,0x00000014d6800000)] + 0x000001c7e09f2000 JavaThread "jar transforms Thread 708" [_thread_blocked, id=92188, stack(0x00000014d6800000,0x00000014d6900000)] + 0x000001c7e09fb000 JavaThread "jar transforms Thread 709" [_thread_blocked, id=96248, stack(0x00000014d6900000,0x00000014d6a00000)] + 0x000001c7e09f8800 JavaThread "jar transforms Thread 710" [_thread_blocked, id=6860, stack(0x00000014d6a00000,0x00000014d6b00000)] + 0x000001c7e09fe000 JavaThread "jar transforms Thread 711" [_thread_blocked, id=100216, stack(0x00000014d6b00000,0x00000014d6c00000)] + 0x000001c7e09ff000 JavaThread "jar transforms Thread 712" [_thread_blocked, id=97436, stack(0x00000014d6c00000,0x00000014d6d00000)] + 0x000001c7e09f9800 JavaThread "jar transforms Thread 713" [_thread_blocked, id=97808, stack(0x00000014d6d00000,0x00000014d6e00000)] + 0x000001c7e09fa000 JavaThread "jar transforms Thread 714" [_thread_blocked, id=98928, stack(0x00000014d6e00000,0x00000014d6f00000)] + 0x000001c7dd357000 JavaThread "jar transforms Thread 715" [_thread_blocked, id=100008, stack(0x00000014d6f00000,0x00000014d7000000)] + 0x000001c7dd359000 JavaThread "jar transforms Thread 716" [_thread_blocked, id=100220, stack(0x00000014d7000000,0x00000014d7100000)] + 0x000001c7dd355800 JavaThread "jar transforms Thread 717" [_thread_blocked, id=97144, stack(0x00000014d7100000,0x00000014d7200000)] + 0x000001c7dd358000 JavaThread "jar transforms Thread 718" [_thread_blocked, id=15564, stack(0x00000014d7200000,0x00000014d7300000)] + 0x000001c7dd359800 JavaThread "jar transforms Thread 719" [_thread_blocked, id=16984, stack(0x00000014d7300000,0x00000014d7400000)] + 0x000001c7dd35a800 JavaThread "jar transforms Thread 720" [_thread_blocked, id=98028, stack(0x00000014d7400000,0x00000014d7500000)] + 0x000001c7ee998800 JavaThread "jar transforms Thread 721" [_thread_blocked, id=96968, stack(0x00000014d7500000,0x00000014d7600000)] + 0x000001c7ee99a000 JavaThread "jar transforms Thread 722" [_thread_blocked, id=97312, stack(0x00000014d7600000,0x00000014d7700000)] + 0x000001c7ee99a800 JavaThread "build event listener" [_thread_blocked, id=67768, stack(0x00000014d7700000,0x00000014d7800000)] + 0x000001c7ee99b800 JavaThread "build event listener" [_thread_blocked, id=99708, stack(0x00000014d7800000,0x00000014d7900000)] + 0x000001c7ee99c800 JavaThread "Execution worker for ':'" [_thread_blocked, id=4668, stack(0x00000014d7a00000,0x00000014d7b00000)] + 0x000001c7ee99d000 JavaThread "Execution worker for ':' Thread 2" [_thread_blocked, id=98452, stack(0x00000014d7b00000,0x00000014d7c00000)] + 0x000001c7ee99e000 JavaThread "Execution worker for ':' Thread 3" [_thread_blocked, id=99212, stack(0x00000014d7c00000,0x00000014d7d00000)] + 0x000001c7ee99f000 JavaThread "Cache worker for execution history cache (C:\Users\Schoumi\projet\peeriscope\.gradle\6.7.1\executionHistory)" [_thread_blocked, id=10420, stack(0x00000014d7d00000,0x00000014d7e00000)] + 0x000001c7ee9a2000 JavaThread "C2 CompilerThread1" daemon [_thread_in_native, id=14604, stack(0x00000014d7e00000,0x00000014d7f00000)] + 0x000001c7ee9a5800 JavaThread "WorkerExecutor Queue" [_thread_blocked, id=93976, stack(0x00000014cf300000,0x00000014cf400000)] + 0x000001c7ee9a0800 JavaThread "WorkerExecutor Queue Thread 2" [_thread_blocked, id=98792, stack(0x00000014d7f00000,0x00000014d8000000)] + +Other Threads: +=>0x000001c7dba75000 VMThread "VM Thread" [stack: 0x00000014cd200000,0x00000014cd300000] [id=98712] + 0x000001c7dbc5d000 WatcherThread [stack: 0x00000014cdc00000,0x00000014cdd00000] [id=95636] + 0x000001c7c0ff3000 GCTaskThread "GC Thread#0" [stack: 0x00000014ccd00000,0x00000014cce00000] [id=97868] + 0x000001c7dc295800 GCTaskThread "GC Thread#1" [stack: 0x00000014cde00000,0x00000014cdf00000] [id=82400] + 0x000001c7dc2bc000 GCTaskThread "GC Thread#2" [stack: 0x00000014cdf00000,0x00000014ce000000] [id=91452] + 0x000001c7dc082800 GCTaskThread "GC Thread#3" [stack: 0x00000014ce000000,0x00000014ce100000] [id=71880] + 0x000001c7c1029000 ConcurrentGCThread "G1 Main Marker" [stack: 0x00000014cce00000,0x00000014ccf00000] [id=99132] + 0x000001c7c102b000 ConcurrentGCThread "G1 Conc#0" [stack: 0x00000014ccf00000,0x00000014cd000000] [id=9740] + 0x000001c7c10be000 ConcurrentGCThread "G1 Refine#0" [stack: 0x00000014cd000000,0x00000014cd100000] [id=97652] + 0x000001c7dbd25000 ConcurrentGCThread "G1 Refine#1" [stack: 0x00000014ce100000,0x00000014ce200000] [id=95648] + 0x000001c7eb2ed800 ConcurrentGCThread "G1 Refine#2" [stack: 0x00000014d0b00000,0x00000014d0c00000] [id=11028] + 0x000001c7edc3f800 ConcurrentGCThread "G1 Refine#3" [stack: 0x00000014d0c00000,0x00000014d0d00000] [id=98332] + 0x000001c7db0aa800 ConcurrentGCThread "G1 Young RemSet Sampling" [stack: 0x00000014cd100000,0x00000014cd200000] [id=97508] + +Threads with active compile tasks: +C2 CompilerThread0 659009 42338 4 com.sun.tools.javac.parser.JavaTokenizer::scanIdent (733 bytes) +C2 CompilerThread1 659009 42203 4 com.sun.tools.javac.code.Symtab::enterClass (71 bytes) + +VM state:at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event]) +[0x000001c7c0fd7110] Threads_lock - owner thread: 0x000001c7dba75000 +[0x000001c7c0fd7b30] Heap_lock - owner thread: 0x000001c788f73000 + +Heap address: 0x0000000080000000, size: 2048 MB, Compressed Oops mode: 32-bit +Narrow klass base: 0x0000000000000000, Narrow klass shift: 3 +Compressed class space size: 1073741824 Address: 0x0000000100000000 + +Heap: + garbage-first heap total 461824K, used 278504K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 8 young (8192K), 8 survivors (8192K) + Metaspace used 249230K, capacity 257612K, committed 257920K, reserved 1273856K + class space used 30216K, capacity 33148K, committed 33228K, reserved 1048576K +Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, A=archive, TAMS=top-at-mark-start (previous, next) +| 0|0x0000000080000000, 0x0000000080100000, 0x0000000080100000|100%| O| |TAMS 0x0000000080100000, 0x0000000080000000| Untracked +| 1|0x0000000080100000, 0x0000000080200000, 0x0000000080200000|100%| O| |TAMS 0x0000000080200000, 0x0000000080100000| Complete +| 2|0x0000000080200000, 0x0000000080300000, 0x0000000080300000|100%| O| |TAMS 0x0000000080300000, 0x0000000080200000| Untracked +| 3|0x0000000080300000, 0x0000000080400000, 0x0000000080400000|100%|HS| |TAMS 0x0000000080400000, 0x0000000080300000| Complete +| 4|0x0000000080400000, 0x0000000080500000, 0x0000000080500000|100%|HC| |TAMS 0x0000000080500000, 0x0000000080400000| Complete +| 5|0x0000000080500000, 0x0000000080600000, 0x0000000080600000|100%|HC| |TAMS 0x0000000080600000, 0x0000000080500000| Complete +| 6|0x0000000080600000, 0x0000000080700000, 0x0000000080700000|100%| O| |TAMS 0x0000000080700000, 0x0000000080600000| Complete +| 7|0x0000000080700000, 0x0000000080800000, 0x0000000080800000|100%| O| |TAMS 0x0000000080800000, 0x0000000080700000| Untracked +| 8|0x0000000080800000, 0x0000000080900000, 0x0000000080900000|100%| O| |TAMS 0x0000000080900000, 0x0000000080800000| Untracked +| 9|0x0000000080900000, 0x0000000080a00000, 0x0000000080a00000|100%| O| |TAMS 0x0000000080a00000, 0x0000000080900000| Untracked +| 10|0x0000000080a00000, 0x0000000080b00000, 0x0000000080b00000|100%| O| |TAMS 0x0000000080b00000, 0x0000000080a00000| Untracked +| 11|0x0000000080b00000, 0x0000000080c00000, 0x0000000080c00000|100%| O| |TAMS 0x0000000080c00000, 0x0000000080b00000| Untracked +| 12|0x0000000080c00000, 0x0000000080d00000, 0x0000000080d00000|100%| O| |TAMS 0x0000000080d00000, 0x0000000080c00000| Untracked +| 13|0x0000000080d00000, 0x0000000080e00000, 0x0000000080e00000|100%| O| |TAMS 0x0000000080e00000, 0x0000000080d00000| Untracked +| 14|0x0000000080e00000, 0x0000000080f00000, 0x0000000080f00000|100%|HS| |TAMS 0x0000000080f00000, 0x0000000080e00000| Complete +| 15|0x0000000080f00000, 0x0000000081000000, 0x0000000081000000|100%|HC| |TAMS 0x0000000081000000, 0x0000000080f00000| Complete +| 16|0x0000000081000000, 0x0000000081100000, 0x0000000081100000|100%|HS| |TAMS 0x0000000081100000, 0x0000000081000000| Complete +| 17|0x0000000081100000, 0x0000000081200000, 0x0000000081200000|100%|HC| |TAMS 0x0000000081200000, 0x0000000081100000| Complete +| 18|0x0000000081200000, 0x0000000081300000, 0x0000000081300000|100%|HC| |TAMS 0x0000000081300000, 0x0000000081200000| Complete +| 19|0x0000000081300000, 0x0000000081400000, 0x0000000081400000|100%|HS| |TAMS 0x0000000081400000, 0x0000000081300000| Complete +| 20|0x0000000081400000, 0x0000000081500000, 0x0000000081500000|100%|HC| |TAMS 0x0000000081500000, 0x0000000081400000| Complete +| 21|0x0000000081500000, 0x0000000081600000, 0x0000000081600000|100%|HC| |TAMS 0x0000000081600000, 0x0000000081500000| Complete +| 22|0x0000000081600000, 0x0000000081700000, 0x0000000081700000|100%|HC| |TAMS 0x0000000081700000, 0x0000000081600000| Complete +| 23|0x0000000081700000, 0x0000000081800000, 0x0000000081800000|100%| O| |TAMS 0x0000000081800000, 0x0000000081700000| Untracked +| 24|0x0000000081800000, 0x0000000081900000, 0x0000000081900000|100%| O| |TAMS 0x0000000081900000, 0x0000000081800000| Untracked +| 25|0x0000000081900000, 0x0000000081a00000, 0x0000000081a00000|100%| O| |TAMS 0x0000000081a00000, 0x0000000081900000| Untracked +| 26|0x0000000081a00000, 0x0000000081b00000, 0x0000000081b00000|100%| O| |TAMS 0x0000000081b00000, 0x0000000081a00000| Complete +| 27|0x0000000081b00000, 0x0000000081c00000, 0x0000000081c00000|100%| O| |TAMS 0x0000000081c00000, 0x0000000081b00000| Untracked +| 28|0x0000000081c00000, 0x0000000081d00000, 0x0000000081d00000|100%|HS| |TAMS 0x0000000081d00000, 0x0000000081c00000| Complete +| 29|0x0000000081d00000, 0x0000000081e00000, 0x0000000081e00000|100%|HC| |TAMS 0x0000000081e00000, 0x0000000081d00000| Complete +| 30|0x0000000081e00000, 0x0000000081f00000, 0x0000000081f00000|100%|HC| |TAMS 0x0000000081f00000, 0x0000000081e00000| Complete +| 31|0x0000000081f00000, 0x0000000082000000, 0x0000000082000000|100%|HC| |TAMS 0x0000000082000000, 0x0000000081f00000| Complete +| 32|0x0000000082000000, 0x0000000082100000, 0x0000000082100000|100%| O| |TAMS 0x0000000082100000, 0x0000000082000000| Untracked +| 33|0x0000000082100000, 0x0000000082200000, 0x0000000082200000|100%| O| |TAMS 0x0000000082200000, 0x0000000082100000| Untracked +| 34|0x0000000082200000, 0x0000000082300000, 0x0000000082300000|100%| O| |TAMS 0x0000000082300000, 0x0000000082200000| Untracked +| 35|0x0000000082300000, 0x0000000082400000, 0x0000000082400000|100%| O| |TAMS 0x0000000082400000, 0x0000000082300000| Untracked +| 36|0x0000000082400000, 0x0000000082500000, 0x0000000082500000|100%| O| |TAMS 0x0000000082500000, 0x0000000082400000| Complete +| 37|0x0000000082500000, 0x0000000082600000, 0x0000000082600000|100%| O| |TAMS 0x0000000082600000, 0x0000000082500000| Complete +| 38|0x0000000082600000, 0x0000000082700000, 0x0000000082700000|100%| O| |TAMS 0x0000000082700000, 0x0000000082600000| Untracked +| 39|0x0000000082700000, 0x0000000082800000, 0x0000000082800000|100%| O| |TAMS 0x0000000082800000, 0x0000000082700000| Untracked +| 40|0x0000000082800000, 0x0000000082900000, 0x0000000082900000|100%| O| |TAMS 0x0000000082900000, 0x0000000082800000| Untracked +| 41|0x0000000082900000, 0x0000000082a00000, 0x0000000082a00000|100%| O| |TAMS 0x0000000082a00000, 0x0000000082900000| Complete +| 42|0x0000000082a00000, 0x0000000082b00000, 0x0000000082b00000|100%| O| |TAMS 0x0000000082b00000, 0x0000000082a00000| Untracked +| 43|0x0000000082b00000, 0x0000000082c00000, 0x0000000082c00000|100%| O| |TAMS 0x0000000082c00000, 0x0000000082b00000| Complete +| 44|0x0000000082c00000, 0x0000000082d00000, 0x0000000082d00000|100%| O| |TAMS 0x0000000082d00000, 0x0000000082c00000| Untracked +| 45|0x0000000082d00000, 0x0000000082e00000, 0x0000000082e00000|100%| O| |TAMS 0x0000000082e00000, 0x0000000082d00000| Untracked +| 46|0x0000000082e00000, 0x0000000082f00000, 0x0000000082f00000|100%| O| |TAMS 0x0000000082f00000, 0x0000000082e00000| Complete +| 47|0x0000000082f00000, 0x0000000083000000, 0x0000000083000000|100%| O| |TAMS 0x0000000083000000, 0x0000000082f00000| Untracked +| 48|0x0000000083000000, 0x0000000083100000, 0x0000000083100000|100%| O| |TAMS 0x0000000083100000, 0x0000000083000000| Untracked +| 49|0x0000000083100000, 0x0000000083200000, 0x0000000083200000|100%| O| |TAMS 0x0000000083200000, 0x0000000083100000| Untracked +| 50|0x0000000083200000, 0x0000000083300000, 0x0000000083300000|100%| O| |TAMS 0x0000000083300000, 0x0000000083200000| Untracked +| 51|0x0000000083300000, 0x0000000083400000, 0x0000000083400000|100%| O| |TAMS 0x0000000083400000, 0x0000000083300000| Untracked +| 52|0x0000000083400000, 0x0000000083500000, 0x0000000083500000|100%| O| |TAMS 0x0000000083500000, 0x0000000083400000| Complete +| 53|0x0000000083500000, 0x0000000083600000, 0x0000000083600000|100%| O| |TAMS 0x0000000083600000, 0x0000000083500000| Complete +| 54|0x0000000083600000, 0x0000000083700000, 0x0000000083700000|100%| O| |TAMS 0x0000000083700000, 0x0000000083600000| Untracked +| 55|0x0000000083700000, 0x0000000083800000, 0x0000000083800000|100%| O| |TAMS 0x0000000083800000, 0x0000000083700000| Complete +| 56|0x0000000083800000, 0x0000000083900000, 0x0000000083900000|100%| O| |TAMS 0x0000000083900000, 0x0000000083800000| Complete +| 57|0x0000000083900000, 0x0000000083a00000, 0x0000000083a00000|100%| O| |TAMS 0x0000000083a00000, 0x0000000083900000| Complete +| 58|0x0000000083a00000, 0x0000000083b00000, 0x0000000083b00000|100%| O| |TAMS 0x0000000083b00000, 0x0000000083a00000| Untracked +| 59|0x0000000083b00000, 0x0000000083c00000, 0x0000000083c00000|100%|HS| |TAMS 0x0000000083c00000, 0x0000000083b00000| Complete +| 60|0x0000000083c00000, 0x0000000083d00000, 0x0000000083d00000|100%| O| |TAMS 0x0000000083d00000, 0x0000000083c00000| Untracked +| 61|0x0000000083d00000, 0x0000000083e00000, 0x0000000083e00000|100%| O| |TAMS 0x0000000083e00000, 0x0000000083d00000| Untracked +| 62|0x0000000083e00000, 0x0000000083f00000, 0x0000000083f00000|100%| O| |TAMS 0x0000000083f00000, 0x0000000083e00000| Untracked +| 63|0x0000000083f00000, 0x0000000084000000, 0x0000000084000000|100%| O| |TAMS 0x0000000084000000, 0x0000000083f00000| Untracked +| 64|0x0000000084000000, 0x0000000084100000, 0x0000000084100000|100%| O| |TAMS 0x0000000084100000, 0x0000000084000000| Untracked +| 65|0x0000000084100000, 0x0000000084200000, 0x0000000084200000|100%| O| |TAMS 0x0000000084200000, 0x0000000084100000| Untracked +| 66|0x0000000084200000, 0x0000000084300000, 0x0000000084300000|100%| O| |TAMS 0x0000000084300000, 0x0000000084200000| Complete +| 67|0x0000000084300000, 0x0000000084400000, 0x0000000084400000|100%|HS| |TAMS 0x0000000084400000, 0x0000000084300000| Complete +| 68|0x0000000084400000, 0x0000000084500000, 0x0000000084500000|100%|HC| |TAMS 0x0000000084500000, 0x0000000084400000| Complete +| 69|0x0000000084500000, 0x0000000084600000, 0x0000000084600000|100%|HC| |TAMS 0x0000000084600000, 0x0000000084500000| Complete +| 70|0x0000000084600000, 0x0000000084700000, 0x0000000084700000|100%| O| |TAMS 0x0000000084700000, 0x0000000084600000| Untracked +| 71|0x0000000084700000, 0x0000000084800000, 0x0000000084800000|100%| O| |TAMS 0x0000000084800000, 0x0000000084700000| Complete +| 72|0x0000000084800000, 0x0000000084900000, 0x0000000084900000|100%| O| |TAMS 0x0000000084900000, 0x0000000084800000| Complete +| 73|0x0000000084900000, 0x0000000084a00000, 0x0000000084a00000|100%| O| |TAMS 0x0000000084a00000, 0x0000000084900000| Untracked +| 74|0x0000000084a00000, 0x0000000084b00000, 0x0000000084b00000|100%| O| |TAMS 0x0000000084b00000, 0x0000000084a00000| Untracked +| 75|0x0000000084b00000, 0x0000000084c00000, 0x0000000084c00000|100%| O| |TAMS 0x0000000084c00000, 0x0000000084b00000| Untracked +| 76|0x0000000084c00000, 0x0000000084d00000, 0x0000000084d00000|100%| O| |TAMS 0x0000000084d00000, 0x0000000084c00000| Complete +| 77|0x0000000084d00000, 0x0000000084e00000, 0x0000000084e00000|100%| O| |TAMS 0x0000000084e00000, 0x0000000084d00000| Untracked +| 78|0x0000000084e00000, 0x0000000084f00000, 0x0000000084f00000|100%| O| |TAMS 0x0000000084f00000, 0x0000000084e00000| Untracked +| 79|0x0000000084f00000, 0x0000000085000000, 0x0000000085000000|100%| O| |TAMS 0x0000000085000000, 0x0000000084f00000| Complete +| 80|0x0000000085000000, 0x0000000085100000, 0x0000000085100000|100%| O| |TAMS 0x0000000085100000, 0x0000000085000000| Untracked +| 81|0x0000000085100000, 0x0000000085200000, 0x0000000085200000|100%| O| |TAMS 0x0000000085200000, 0x0000000085100000| Untracked +| 82|0x0000000085200000, 0x0000000085300000, 0x0000000085300000|100%| O| |TAMS 0x0000000085300000, 0x0000000085200000| Untracked +| 83|0x0000000085300000, 0x0000000085400000, 0x0000000085400000|100%| O| |TAMS 0x0000000085400000, 0x0000000085300000| Untracked +| 84|0x0000000085400000, 0x0000000085500000, 0x0000000085500000|100%| O| |TAMS 0x0000000085500000, 0x0000000085400000| Untracked +| 85|0x0000000085500000, 0x0000000085600000, 0x0000000085600000|100%|HS| |TAMS 0x0000000085600000, 0x0000000085500000| Complete +| 86|0x0000000085600000, 0x0000000085700000, 0x0000000085700000|100%|HS| |TAMS 0x0000000085700000, 0x0000000085600000| Complete +| 87|0x0000000085700000, 0x0000000085800000, 0x0000000085800000|100%|HC| |TAMS 0x0000000085800000, 0x0000000085700000| Complete +| 88|0x0000000085800000, 0x0000000085900000, 0x0000000085900000|100%| O| |TAMS 0x0000000085900000, 0x0000000085800000| Untracked +| 89|0x0000000085900000, 0x0000000085a00000, 0x0000000085a00000|100%| O| |TAMS 0x0000000085a00000, 0x0000000085900000| Untracked +| 90|0x0000000085a00000, 0x0000000085b00000, 0x0000000085b00000|100%| O| |TAMS 0x0000000085b00000, 0x0000000085a00000| Untracked +| 91|0x0000000085b00000, 0x0000000085c00000, 0x0000000085c00000|100%| O| |TAMS 0x0000000085c00000, 0x0000000085b00000| Complete +| 92|0x0000000085c00000, 0x0000000085d00000, 0x0000000085d00000|100%| O| |TAMS 0x0000000085d00000, 0x0000000085c00000| Untracked +| 93|0x0000000085d00000, 0x0000000085e00000, 0x0000000085e00000|100%| O| |TAMS 0x0000000085e00000, 0x0000000085d00000| Untracked +| 94|0x0000000085e00000, 0x0000000085f00000, 0x0000000085f00000|100%| O| |TAMS 0x0000000085f00000, 0x0000000085e00000| Complete +| 95|0x0000000085f00000, 0x0000000086000000, 0x0000000086000000|100%| O| |TAMS 0x0000000086000000, 0x0000000085f00000| Untracked +| 96|0x0000000086000000, 0x0000000086100000, 0x0000000086100000|100%| O| |TAMS 0x0000000086100000, 0x0000000086000000| Untracked +| 97|0x0000000086100000, 0x0000000086200000, 0x0000000086200000|100%| O| |TAMS 0x0000000086200000, 0x0000000086100000| Untracked +| 98|0x0000000086200000, 0x0000000086300000, 0x0000000086300000|100%| O| |TAMS 0x0000000086300000, 0x0000000086200000| Untracked +| 99|0x0000000086300000, 0x0000000086400000, 0x0000000086400000|100%|HS| |TAMS 0x0000000086400000, 0x0000000086300000| Complete +| 100|0x0000000086400000, 0x0000000086500000, 0x0000000086500000|100%|HC| |TAMS 0x0000000086500000, 0x0000000086400000| Complete +| 101|0x0000000086500000, 0x0000000086600000, 0x0000000086600000|100%|HC| |TAMS 0x0000000086600000, 0x0000000086500000| Complete +| 102|0x0000000086600000, 0x0000000086700000, 0x0000000086700000|100%| O| |TAMS 0x0000000086700000, 0x0000000086600000| Complete +| 103|0x0000000086700000, 0x0000000086800000, 0x0000000086800000|100%| O| |TAMS 0x0000000086800000, 0x0000000086700000| Complete +| 104|0x0000000086800000, 0x0000000086900000, 0x0000000086900000|100%| O| |TAMS 0x0000000086900000, 0x0000000086800000| Complete +| 105|0x0000000086900000, 0x0000000086a00000, 0x0000000086a00000|100%| O| |TAMS 0x0000000086a00000, 0x0000000086900000| Complete +| 106|0x0000000086a00000, 0x0000000086b00000, 0x0000000086b00000|100%| O| |TAMS 0x0000000086b00000, 0x0000000086a00000| Complete +| 107|0x0000000086b00000, 0x0000000086c00000, 0x0000000086c00000|100%| O| |TAMS 0x0000000086c00000, 0x0000000086b00000| Complete +| 108|0x0000000086c00000, 0x0000000086d00000, 0x0000000086d00000|100%| O| |TAMS 0x0000000086d00000, 0x0000000086c00000| Complete +| 109|0x0000000086d00000, 0x0000000086e00000, 0x0000000086e00000|100%| O| |TAMS 0x0000000086e00000, 0x0000000086d00000| Complete +| 110|0x0000000086e00000, 0x0000000086f00000, 0x0000000086f00000|100%| O| |TAMS 0x0000000086f00000, 0x0000000086e00000| Untracked +| 111|0x0000000086f00000, 0x0000000087000000, 0x0000000087000000|100%| O| |TAMS 0x0000000087000000, 0x0000000086f00000| Untracked +| 112|0x0000000087000000, 0x0000000087100000, 0x0000000087100000|100%| O| |TAMS 0x0000000087100000, 0x0000000087000000| Untracked +| 113|0x0000000087100000, 0x0000000087200000, 0x0000000087200000|100%| O| |TAMS 0x0000000087200000, 0x0000000087100000| Untracked +| 114|0x0000000087200000, 0x0000000087300000, 0x0000000087300000|100%| O| |TAMS 0x0000000087300000, 0x0000000087200000| Complete +| 115|0x0000000087300000, 0x0000000087400000, 0x0000000087400000|100%| O| |TAMS 0x0000000087400000, 0x0000000087300000| Untracked +| 116|0x0000000087400000, 0x0000000087500000, 0x0000000087500000|100%| O| |TAMS 0x0000000087500000, 0x0000000087400000| Complete +| 117|0x0000000087500000, 0x0000000087600000, 0x0000000087600000|100%| O| |TAMS 0x0000000087600000, 0x0000000087500000| Untracked +| 118|0x0000000087600000, 0x0000000087700000, 0x0000000087700000|100%| O| |TAMS 0x0000000087700000, 0x0000000087600000| Untracked +| 119|0x0000000087700000, 0x0000000087800000, 0x0000000087800000|100%| O| |TAMS 0x0000000087800000, 0x0000000087700000| Complete +| 120|0x0000000087800000, 0x0000000087900000, 0x0000000087900000|100%| O| |TAMS 0x0000000087900000, 0x0000000087800000| Complete +| 121|0x0000000087900000, 0x0000000087a00000, 0x0000000087a00000|100%| O| |TAMS 0x0000000087a00000, 0x0000000087900000| Untracked +| 122|0x0000000087a00000, 0x0000000087b00000, 0x0000000087b00000|100%| O| |TAMS 0x0000000087b00000, 0x0000000087a00000| Untracked +| 123|0x0000000087b00000, 0x0000000087c00000, 0x0000000087c00000|100%| O| |TAMS 0x0000000087c00000, 0x0000000087b00000| Untracked +| 124|0x0000000087c00000, 0x0000000087d00000, 0x0000000087d00000|100%| O| |TAMS 0x0000000087d00000, 0x0000000087c00000| Untracked +| 125|0x0000000087d00000, 0x0000000087e00000, 0x0000000087e00000|100%| O| |TAMS 0x0000000087e00000, 0x0000000087d00000| Untracked +| 126|0x0000000087e00000, 0x0000000087f00000, 0x0000000087f00000|100%| O| |TAMS 0x0000000087f00000, 0x0000000087e00000| Complete +| 127|0x0000000087f00000, 0x0000000088000000, 0x0000000088000000|100%| O| |TAMS 0x0000000088000000, 0x0000000087f00000| Untracked +| 128|0x0000000088000000, 0x0000000088100000, 0x0000000088100000|100%| O| |TAMS 0x0000000088100000, 0x0000000088000000| Complete +| 129|0x0000000088100000, 0x0000000088200000, 0x0000000088200000|100%| O| |TAMS 0x0000000088200000, 0x0000000088100000| Untracked +| 130|0x0000000088200000, 0x0000000088300000, 0x0000000088300000|100%| O| |TAMS 0x0000000088300000, 0x0000000088200000| Complete +| 131|0x0000000088300000, 0x0000000088400000, 0x0000000088400000|100%| O| |TAMS 0x0000000088400000, 0x0000000088300000| Complete +| 132|0x0000000088400000, 0x0000000088500000, 0x0000000088500000|100%| O| |TAMS 0x0000000088500000, 0x0000000088400000| Untracked +| 133|0x0000000088500000, 0x0000000088600000, 0x0000000088600000|100%| O| |TAMS 0x0000000088600000, 0x0000000088500000| Untracked +| 134|0x0000000088600000, 0x0000000088700000, 0x0000000088700000|100%| O| |TAMS 0x0000000088700000, 0x0000000088600000| Untracked +| 135|0x0000000088700000, 0x0000000088800000, 0x0000000088800000|100%| O| |TAMS 0x0000000088800000, 0x0000000088700000| Complete +| 136|0x0000000088800000, 0x0000000088900000, 0x0000000088900000|100%| O| |TAMS 0x0000000088900000, 0x0000000088800000| Untracked +| 137|0x0000000088900000, 0x0000000088a00000, 0x0000000088a00000|100%| O| |TAMS 0x0000000088a00000, 0x0000000088900000| Untracked +| 138|0x0000000088a00000, 0x0000000088b00000, 0x0000000088b00000|100%| O| |TAMS 0x0000000088b00000, 0x0000000088a00000| Untracked +| 139|0x0000000088b00000, 0x0000000088c00000, 0x0000000088c00000|100%| O| |TAMS 0x0000000088c00000, 0x0000000088b00000| Untracked +| 140|0x0000000088c00000, 0x0000000088d00000, 0x0000000088d00000|100%| O| |TAMS 0x0000000088d00000, 0x0000000088c00000| Complete +| 141|0x0000000088d00000, 0x0000000088e00000, 0x0000000088e00000|100%| O| |TAMS 0x0000000088e00000, 0x0000000088d00000| Untracked +| 142|0x0000000088e00000, 0x0000000088f00000, 0x0000000088f00000|100%| O| |TAMS 0x0000000088f00000, 0x0000000088e00000| Complete +| 143|0x0000000088f00000, 0x0000000089000000, 0x0000000089000000|100%| O| |TAMS 0x0000000089000000, 0x0000000088f00000| Complete +| 144|0x0000000089000000, 0x0000000089100000, 0x0000000089100000|100%| O| |TAMS 0x0000000089100000, 0x0000000089000000| Complete +| 145|0x0000000089100000, 0x0000000089200000, 0x0000000089200000|100%| O| |TAMS 0x0000000089200000, 0x0000000089100000| Complete +| 146|0x0000000089200000, 0x0000000089300000, 0x0000000089300000|100%| O| |TAMS 0x0000000089300000, 0x0000000089200000| Untracked +| 147|0x0000000089300000, 0x0000000089400000, 0x0000000089400000|100%| O| |TAMS 0x0000000089400000, 0x0000000089300000| Complete +| 148|0x0000000089400000, 0x0000000089500000, 0x0000000089500000|100%| O| |TAMS 0x0000000089500000, 0x0000000089400000| Untracked +| 149|0x0000000089500000, 0x0000000089600000, 0x0000000089600000|100%| O| |TAMS 0x0000000089600000, 0x0000000089500000| Untracked +| 150|0x0000000089600000, 0x0000000089700000, 0x0000000089700000|100%| O| |TAMS 0x0000000089700000, 0x0000000089600000| Untracked +| 151|0x0000000089700000, 0x0000000089800000, 0x0000000089800000|100%| O| |TAMS 0x0000000089800000, 0x0000000089700000| Untracked +| 152|0x0000000089800000, 0x0000000089900000, 0x0000000089900000|100%| O| |TAMS 0x0000000089900000, 0x0000000089800000| Complete +| 153|0x0000000089900000, 0x0000000089a00000, 0x0000000089a00000|100%| O| |TAMS 0x0000000089a00000, 0x0000000089900000| Untracked +| 154|0x0000000089a00000, 0x0000000089b00000, 0x0000000089b00000|100%| O| |TAMS 0x0000000089b00000, 0x0000000089a00000| Untracked +| 155|0x0000000089b00000, 0x0000000089c00000, 0x0000000089c00000|100%| O| |TAMS 0x0000000089c00000, 0x0000000089b00000| Complete +| 156|0x0000000089c00000, 0x0000000089d00000, 0x0000000089d00000|100%| O| |TAMS 0x0000000089d00000, 0x0000000089c00000| Complete +| 157|0x0000000089d00000, 0x0000000089e00000, 0x0000000089e00000|100%|HS| |TAMS 0x0000000089e00000, 0x0000000089d00000| Complete +| 158|0x0000000089e00000, 0x0000000089f00000, 0x0000000089f00000|100%|HC| |TAMS 0x0000000089f00000, 0x0000000089e00000| Complete +| 159|0x0000000089f00000, 0x000000008a000000, 0x000000008a000000|100%|HC| |TAMS 0x000000008a000000, 0x0000000089f00000| Complete +| 160|0x000000008a000000, 0x000000008a100000, 0x000000008a100000|100%| O| |TAMS 0x000000008a100000, 0x000000008a000000| Untracked +| 161|0x000000008a100000, 0x000000008a200000, 0x000000008a200000|100%| O| |TAMS 0x000000008a200000, 0x000000008a100000| Untracked +| 162|0x000000008a200000, 0x000000008a300000, 0x000000008a300000|100%| O| |TAMS 0x000000008a300000, 0x000000008a200000| Complete +| 163|0x000000008a300000, 0x000000008a400000, 0x000000008a400000|100%| O| |TAMS 0x000000008a400000, 0x000000008a300000| Complete +| 164|0x000000008a400000, 0x000000008a500000, 0x000000008a500000|100%| O| |TAMS 0x000000008a500000, 0x000000008a400000| Untracked +| 165|0x000000008a500000, 0x000000008a600000, 0x000000008a600000|100%| O| |TAMS 0x000000008a600000, 0x000000008a500000| Complete +| 166|0x000000008a600000, 0x000000008a700000, 0x000000008a700000|100%| O| |TAMS 0x000000008a700000, 0x000000008a600000| Untracked +| 167|0x000000008a700000, 0x000000008a800000, 0x000000008a800000|100%| O| |TAMS 0x000000008a800000, 0x000000008a700000| Complete +| 168|0x000000008a800000, 0x000000008a900000, 0x000000008a900000|100%| O| |TAMS 0x000000008a900000, 0x000000008a800000| Complete +| 169|0x000000008a900000, 0x000000008aa00000, 0x000000008aa00000|100%| O| |TAMS 0x000000008aa00000, 0x000000008a900000| Untracked +| 170|0x000000008aa00000, 0x000000008ab00000, 0x000000008ab00000|100%| O| |TAMS 0x000000008ab00000, 0x000000008aa00000| Untracked +| 171|0x000000008ab00000, 0x000000008ac00000, 0x000000008ac00000|100%| O| |TAMS 0x000000008ac00000, 0x000000008ab00000| Untracked +| 172|0x000000008ac00000, 0x000000008ad00000, 0x000000008ad00000|100%| O| |TAMS 0x000000008ad00000, 0x000000008ac00000| Untracked +| 173|0x000000008ad00000, 0x000000008ae00000, 0x000000008ae00000|100%| O| |TAMS 0x000000008ae00000, 0x000000008ad00000| Untracked +| 174|0x000000008ae00000, 0x000000008af00000, 0x000000008af00000|100%| O| |TAMS 0x000000008af00000, 0x000000008ae00000| Complete +| 175|0x000000008af00000, 0x000000008b000000, 0x000000008b000000|100%| O| |TAMS 0x000000008b000000, 0x000000008af00000| Complete +| 176|0x000000008b000000, 0x000000008b100000, 0x000000008b100000|100%| O| |TAMS 0x000000008b100000, 0x000000008b000000| Untracked +| 177|0x000000008b100000, 0x000000008b200000, 0x000000008b200000|100%| O| |TAMS 0x000000008b200000, 0x000000008b100000| Untracked +| 178|0x000000008b200000, 0x000000008b300000, 0x000000008b300000|100%| O| |TAMS 0x000000008b300000, 0x000000008b200000| Untracked +| 179|0x000000008b300000, 0x000000008b400000, 0x000000008b400000|100%| O| |TAMS 0x000000008b400000, 0x000000008b300000| Complete +| 180|0x000000008b400000, 0x000000008b500000, 0x000000008b500000|100%| O| |TAMS 0x000000008b500000, 0x000000008b400000| Untracked +| 181|0x000000008b500000, 0x000000008b600000, 0x000000008b600000|100%| O| |TAMS 0x000000008b600000, 0x000000008b500000| Complete +| 182|0x000000008b600000, 0x000000008b700000, 0x000000008b700000|100%| O| |TAMS 0x000000008b700000, 0x000000008b600000| Untracked +| 183|0x000000008b700000, 0x000000008b800000, 0x000000008b800000|100%| O| |TAMS 0x000000008b800000, 0x000000008b700000| Complete +| 184|0x000000008b800000, 0x000000008b900000, 0x000000008b900000|100%| O| |TAMS 0x000000008b900000, 0x000000008b800000| Untracked +| 185|0x000000008b900000, 0x000000008ba00000, 0x000000008ba00000|100%| O| |TAMS 0x000000008ba00000, 0x000000008b900000| Complete +| 186|0x000000008ba00000, 0x000000008bb00000, 0x000000008bb00000|100%| O| |TAMS 0x000000008bb00000, 0x000000008ba00000| Untracked +| 187|0x000000008bb00000, 0x000000008bc00000, 0x000000008bc00000|100%| O| |TAMS 0x000000008bc00000, 0x000000008bb00000| Untracked +| 188|0x000000008bc00000, 0x000000008bd00000, 0x000000008bd00000|100%| O| |TAMS 0x000000008bd00000, 0x000000008bc00000| Untracked +| 189|0x000000008bd00000, 0x000000008be00000, 0x000000008be00000|100%| O| |TAMS 0x000000008be00000, 0x000000008bd00000| Complete +| 190|0x000000008be00000, 0x000000008bf00000, 0x000000008bf00000|100%| O| |TAMS 0x000000008bf00000, 0x000000008be00000| Complete +| 191|0x000000008bf00000, 0x000000008c000000, 0x000000008c000000|100%| O| |TAMS 0x000000008c000000, 0x000000008bf00000| Untracked +| 192|0x000000008c000000, 0x000000008c100000, 0x000000008c100000|100%| O| |TAMS 0x000000008c100000, 0x000000008c000000| Untracked +| 193|0x000000008c100000, 0x000000008c200000, 0x000000008c200000|100%| O| |TAMS 0x000000008c200000, 0x000000008c100000| Complete +| 194|0x000000008c200000, 0x000000008c300000, 0x000000008c300000|100%|HS| |TAMS 0x000000008c300000, 0x000000008c200000| Complete +| 195|0x000000008c300000, 0x000000008c400000, 0x000000008c400000|100%|HC| |TAMS 0x000000008c400000, 0x000000008c300000| Complete +| 196|0x000000008c400000, 0x000000008c500000, 0x000000008c500000|100%|HC| |TAMS 0x000000008c500000, 0x000000008c400000| Complete +| 197|0x000000008c500000, 0x000000008c600000, 0x000000008c600000|100%| O| |TAMS 0x000000008c600000, 0x000000008c500000| Complete +| 198|0x000000008c600000, 0x000000008c700000, 0x000000008c700000|100%| O| |TAMS 0x000000008c700000, 0x000000008c600000| Untracked +| 199|0x000000008c700000, 0x000000008c800000, 0x000000008c800000|100%| O| |TAMS 0x000000008c800000, 0x000000008c700000| Untracked +| 200|0x000000008c800000, 0x000000008c900000, 0x000000008c900000|100%| O| |TAMS 0x000000008c900000, 0x000000008c800000| Complete +| 201|0x000000008c900000, 0x000000008ca00000, 0x000000008ca00000|100%|HS| |TAMS 0x000000008ca00000, 0x000000008c900000| Complete +| 202|0x000000008ca00000, 0x000000008cb00000, 0x000000008cb00000|100%|HC| |TAMS 0x000000008cb00000, 0x000000008ca00000| Complete +| 203|0x000000008cb00000, 0x000000008cc00000, 0x000000008cc00000|100%| O| |TAMS 0x000000008cc00000, 0x000000008cb00000| Untracked +| 204|0x000000008cc00000, 0x000000008cd00000, 0x000000008cd00000|100%| O| |TAMS 0x000000008cd00000, 0x000000008cc00000| Untracked +| 205|0x000000008cd00000, 0x000000008ce00000, 0x000000008ce00000|100%| O| |TAMS 0x000000008ce00000, 0x000000008cd00000| Untracked +| 206|0x000000008ce00000, 0x000000008cf00000, 0x000000008cf00000|100%| O| |TAMS 0x000000008cf00000, 0x000000008ce00000| Untracked +| 207|0x000000008cf00000, 0x000000008d000000, 0x000000008d000000|100%| O| |TAMS 0x000000008d000000, 0x000000008cf00000| Untracked +| 208|0x000000008d000000, 0x000000008d100000, 0x000000008d100000|100%| O| |TAMS 0x000000008d100000, 0x000000008d000000| Untracked +| 209|0x000000008d100000, 0x000000008d200000, 0x000000008d200000|100%| O| |TAMS 0x000000008d200000, 0x000000008d100000| Complete +| 210|0x000000008d200000, 0x000000008d300000, 0x000000008d300000|100%| O| |TAMS 0x000000008d300000, 0x000000008d200000| Untracked +| 211|0x000000008d300000, 0x000000008d400000, 0x000000008d400000|100%| O| |TAMS 0x000000008d400000, 0x000000008d300000| Untracked +| 212|0x000000008d400000, 0x000000008d500000, 0x000000008d500000|100%| O| |TAMS 0x000000008d500000, 0x000000008d400000| Untracked +| 213|0x000000008d500000, 0x000000008d600000, 0x000000008d600000|100%| O| |TAMS 0x000000008d600000, 0x000000008d500000| Complete +| 214|0x000000008d600000, 0x000000008d700000, 0x000000008d700000|100%| O| |TAMS 0x000000008d700000, 0x000000008d600000| Untracked +| 215|0x000000008d700000, 0x000000008d800000, 0x000000008d800000|100%| O| |TAMS 0x000000008d800000, 0x000000008d700000| Untracked +| 216|0x000000008d800000, 0x000000008d900000, 0x000000008d900000|100%| O| |TAMS 0x000000008d900000, 0x000000008d800000| Untracked +| 217|0x000000008d900000, 0x000000008da00000, 0x000000008da00000|100%| O| |TAMS 0x000000008da00000, 0x000000008d900000| Untracked +| 218|0x000000008da00000, 0x000000008db00000, 0x000000008db00000|100%| O| |TAMS 0x000000008db00000, 0x000000008da00000| Untracked +| 219|0x000000008db00000, 0x000000008dc00000, 0x000000008dc00000|100%| O| |TAMS 0x000000008dc00000, 0x000000008db00000| Untracked +| 220|0x000000008dc00000, 0x000000008dd00000, 0x000000008dd00000|100%| O| |TAMS 0x000000008dd00000, 0x000000008dc00000| Untracked +| 221|0x000000008dd00000, 0x000000008de00000, 0x000000008de00000|100%| O| |TAMS 0x000000008de00000, 0x000000008dd00000| Untracked +| 222|0x000000008de00000, 0x000000008df00000, 0x000000008df00000|100%| O| |TAMS 0x000000008df00000, 0x000000008de00000| Untracked +| 223|0x000000008df00000, 0x000000008e000000, 0x000000008e000000|100%| O| |TAMS 0x000000008e000000, 0x000000008df00000| Untracked +| 224|0x000000008e000000, 0x000000008e100000, 0x000000008e100000|100%| O| |TAMS 0x000000008e100000, 0x000000008e000000| Untracked +| 225|0x000000008e100000, 0x000000008e200000, 0x000000008e200000|100%| O| |TAMS 0x000000008e200000, 0x000000008e100000| Untracked +| 226|0x000000008e200000, 0x000000008e300000, 0x000000008e300000|100%| O| |TAMS 0x000000008e300000, 0x000000008e200000| Complete +| 227|0x000000008e300000, 0x000000008e400000, 0x000000008e400000|100%| O| |TAMS 0x000000008e400000, 0x000000008e300000| Untracked +| 228|0x000000008e400000, 0x000000008e500000, 0x000000008e500000|100%| O| |TAMS 0x000000008e500000, 0x000000008e400000| Complete +| 229|0x000000008e500000, 0x000000008e600000, 0x000000008e600000|100%| O| |TAMS 0x000000008e600000, 0x000000008e500000| Untracked +| 230|0x000000008e600000, 0x000000008e700000, 0x000000008e700000|100%| O| |TAMS 0x000000008e700000, 0x000000008e600000| Untracked +| 231|0x000000008e700000, 0x000000008e800000, 0x000000008e800000|100%| O| |TAMS 0x000000008e800000, 0x000000008e700000| Untracked +| 232|0x000000008e800000, 0x000000008e900000, 0x000000008e900000|100%| O| |TAMS 0x000000008e900000, 0x000000008e800000| Complete +| 233|0x000000008e900000, 0x000000008ea00000, 0x000000008ea00000|100%| O| |TAMS 0x000000008ea00000, 0x000000008e900000| Untracked +| 234|0x000000008ea00000, 0x000000008eb00000, 0x000000008eb00000|100%| O| |TAMS 0x000000008eb00000, 0x000000008ea00000| Untracked +| 235|0x000000008eb00000, 0x000000008ec00000, 0x000000008ec00000|100%| O| |TAMS 0x000000008ec00000, 0x000000008eb00000| Untracked +| 236|0x000000008ec00000, 0x000000008ed00000, 0x000000008ed00000|100%| O| |TAMS 0x000000008ed00000, 0x000000008ec00000| Untracked +| 237|0x000000008ed00000, 0x000000008ee00000, 0x000000008ee00000|100%| O| |TAMS 0x000000008ee00000, 0x000000008ed00000| Untracked +| 238|0x000000008ee00000, 0x000000008ef00000, 0x000000008ef00000|100%| O| |TAMS 0x000000008ef00000, 0x000000008ee00000| Untracked +| 239|0x000000008ef00000, 0x000000008f000000, 0x000000008f000000|100%| O| |TAMS 0x000000008f000000, 0x000000008ef00000| Untracked +| 240|0x000000008f000000, 0x000000008f100000, 0x000000008f100000|100%| O| |TAMS 0x000000008f100000, 0x000000008f000000| Untracked +| 241|0x000000008f100000, 0x000000008f200000, 0x000000008f200000|100%| O| |TAMS 0x000000008f200000, 0x000000008f100000| Untracked +| 242|0x000000008f200000, 0x000000008f300000, 0x000000008f300000|100%| O| |TAMS 0x000000008f300000, 0x000000008f200000| Untracked +| 243|0x000000008f300000, 0x000000008f400000, 0x000000008f400000|100%| O| |TAMS 0x000000008f400000, 0x000000008f300000| Untracked +| 244|0x000000008f400000, 0x000000008f500000, 0x000000008f500000|100%| O| |TAMS 0x000000008f500000, 0x000000008f400000| Untracked +| 245|0x000000008f500000, 0x000000008f600000, 0x000000008f600000|100%| O| |TAMS 0x000000008f600000, 0x000000008f500000| Untracked +| 246|0x000000008f600000, 0x000000008f700000, 0x000000008f700000|100%| O| |TAMS 0x000000008f700000, 0x000000008f600000| Untracked +| 247|0x000000008f700000, 0x000000008f800000, 0x000000008f800000|100%| O| |TAMS 0x000000008f800000, 0x000000008f700000| Untracked +| 248|0x000000008f800000, 0x000000008f900000, 0x000000008f900000|100%| O| |TAMS 0x000000008f900000, 0x000000008f800000| Untracked +| 249|0x000000008f900000, 0x000000008fa00000, 0x000000008fa00000|100%|HS| |TAMS 0x000000008f900000, 0x000000008f900000| Complete +| 250|0x000000008fa00000, 0x000000008fb00000, 0x000000008fb00000|100%|HC| |TAMS 0x000000008fa00000, 0x000000008fa00000| Complete +| 251|0x000000008fb00000, 0x000000008fb00000, 0x000000008fc00000| 0%| F| |TAMS 0x000000008fb00000, 0x000000008fb00000| Untracked +| 252|0x000000008fc00000, 0x000000008fc00000, 0x000000008fd00000| 0%| F| |TAMS 0x000000008fc00000, 0x000000008fc00000| Untracked +| 253|0x000000008fd00000, 0x000000008fe00000, 0x000000008fe00000|100%| O| |TAMS 0x000000008fd00000, 0x000000008fd00000| Untracked +| 254|0x000000008fe00000, 0x000000008ff00000, 0x000000008ff00000|100%| O| |TAMS 0x000000008fe00000, 0x000000008fe00000| Untracked +| 255|0x000000008ff00000, 0x0000000090000000, 0x0000000090000000|100%| O| |TAMS 0x000000008ff00000, 0x000000008ff00000| Untracked +| 256|0x0000000090000000, 0x0000000090100000, 0x0000000090100000|100%| O| |TAMS 0x0000000090000000, 0x0000000090000000| Untracked +| 257|0x0000000090100000, 0x0000000090200000, 0x0000000090200000|100%| O| |TAMS 0x0000000090100000, 0x0000000090100000| Untracked +| 258|0x0000000090200000, 0x0000000090300000, 0x0000000090300000|100%| O| |TAMS 0x0000000090200000, 0x0000000090200000| Untracked +| 259|0x0000000090300000, 0x0000000090400000, 0x0000000090400000|100%| O| |TAMS 0x0000000090300000, 0x0000000090300000| Untracked +| 260|0x0000000090400000, 0x0000000090500000, 0x0000000090500000|100%| O| |TAMS 0x0000000090400000, 0x0000000090400000| Untracked +| 261|0x0000000090500000, 0x0000000090600000, 0x0000000090600000|100%| O| |TAMS 0x0000000090500000, 0x0000000090500000| Untracked +| 262|0x0000000090600000, 0x0000000090700000, 0x0000000090700000|100%| O| |TAMS 0x0000000090600000, 0x0000000090600000| Untracked +| 263|0x0000000090700000, 0x0000000090800000, 0x0000000090800000|100%| O| |TAMS 0x0000000090700000, 0x0000000090700000| Untracked +| 264|0x0000000090800000, 0x0000000090900000, 0x0000000090900000|100%| O| |TAMS 0x0000000090800000, 0x0000000090800000| Untracked +| 265|0x0000000090900000, 0x0000000090980000, 0x0000000090a00000| 50%| O| |TAMS 0x0000000090900000, 0x0000000090900000| Untracked +| 266|0x0000000090a00000, 0x0000000090a00000, 0x0000000090b00000| 0%| F| |TAMS 0x0000000090a00000, 0x0000000090a00000| Untracked +| 267|0x0000000090b00000, 0x0000000090b00000, 0x0000000090c00000| 0%| F| |TAMS 0x0000000090b00000, 0x0000000090b00000| Untracked +| 268|0x0000000090c00000, 0x0000000090c00000, 0x0000000090d00000| 0%| F| |TAMS 0x0000000090c00000, 0x0000000090c00000| Untracked +| 269|0x0000000090d00000, 0x0000000090d00000, 0x0000000090e00000| 0%| F| |TAMS 0x0000000090d00000, 0x0000000090d00000| Untracked +| 270|0x0000000090e00000, 0x0000000090e00000, 0x0000000090f00000| 0%| F| |TAMS 0x0000000090e00000, 0x0000000090e00000| Untracked +| 271|0x0000000090f00000, 0x0000000090f00000, 0x0000000091000000| 0%| F| |TAMS 0x0000000090f00000, 0x0000000090f00000| Untracked +| 272|0x0000000091000000, 0x0000000091000000, 0x0000000091100000| 0%| F| |TAMS 0x0000000091000000, 0x0000000091000000| Untracked +| 273|0x0000000091100000, 0x0000000091100000, 0x0000000091200000| 0%| F| |TAMS 0x0000000091100000, 0x0000000091100000| Untracked +| 274|0x0000000091200000, 0x0000000091200000, 0x0000000091300000| 0%| F| |TAMS 0x0000000091200000, 0x0000000091200000| Untracked +| 275|0x0000000091300000, 0x0000000091300000, 0x0000000091400000| 0%| F| |TAMS 0x0000000091300000, 0x0000000091300000| Untracked +| 276|0x0000000091400000, 0x0000000091400000, 0x0000000091500000| 0%| F| |TAMS 0x0000000091400000, 0x0000000091400000| Untracked +| 277|0x0000000091500000, 0x0000000091500000, 0x0000000091600000| 0%| F| |TAMS 0x0000000091500000, 0x0000000091500000| Untracked +| 278|0x0000000091600000, 0x0000000091600000, 0x0000000091700000| 0%| F| |TAMS 0x0000000091600000, 0x0000000091600000| Untracked +| 279|0x0000000091700000, 0x0000000091700000, 0x0000000091800000| 0%| F| |TAMS 0x0000000091700000, 0x0000000091700000| Untracked +| 280|0x0000000091800000, 0x0000000091800000, 0x0000000091900000| 0%| F| |TAMS 0x0000000091800000, 0x0000000091800000| Untracked +| 281|0x0000000091900000, 0x0000000091900000, 0x0000000091a00000| 0%| F| |TAMS 0x0000000091900000, 0x0000000091900000| Untracked +| 282|0x0000000091a00000, 0x0000000091a00000, 0x0000000091b00000| 0%| F| |TAMS 0x0000000091a00000, 0x0000000091a00000| Untracked +| 283|0x0000000091b00000, 0x0000000091b00000, 0x0000000091c00000| 0%| F| |TAMS 0x0000000091b00000, 0x0000000091b00000| Untracked +| 284|0x0000000091c00000, 0x0000000091c00000, 0x0000000091d00000| 0%| F| |TAMS 0x0000000091c00000, 0x0000000091c00000| Untracked +| 285|0x0000000091d00000, 0x0000000091d00000, 0x0000000091e00000| 0%| F| |TAMS 0x0000000091d00000, 0x0000000091d00000| Untracked +| 286|0x0000000091e00000, 0x0000000091e00000, 0x0000000091f00000| 0%| F| |TAMS 0x0000000091e00000, 0x0000000091e00000| Untracked +| 287|0x0000000091f00000, 0x0000000091f00000, 0x0000000092000000| 0%| F| |TAMS 0x0000000091f00000, 0x0000000091f00000| Untracked +| 288|0x0000000092000000, 0x0000000092000000, 0x0000000092100000| 0%| F| |TAMS 0x0000000092000000, 0x0000000092000000| Untracked +| 289|0x0000000092100000, 0x0000000092100000, 0x0000000092200000| 0%| F| |TAMS 0x0000000092100000, 0x0000000092100000| Untracked +| 290|0x0000000092200000, 0x0000000092200000, 0x0000000092300000| 0%| F| |TAMS 0x0000000092200000, 0x0000000092200000| Untracked +| 291|0x0000000092300000, 0x0000000092300000, 0x0000000092400000| 0%| F| |TAMS 0x0000000092300000, 0x0000000092300000| Untracked +| 292|0x0000000092400000, 0x0000000092400000, 0x0000000092500000| 0%| F| |TAMS 0x0000000092400000, 0x0000000092400000| Untracked +| 293|0x0000000092500000, 0x0000000092500000, 0x0000000092600000| 0%| F| |TAMS 0x0000000092500000, 0x0000000092500000| Untracked +| 294|0x0000000092600000, 0x0000000092600000, 0x0000000092700000| 0%| F| |TAMS 0x0000000092600000, 0x0000000092600000| Untracked +| 295|0x0000000092700000, 0x0000000092800000, 0x0000000092800000|100%| O| |TAMS 0x0000000092800000, 0x0000000092700000| Complete +| 296|0x0000000092800000, 0x0000000092800000, 0x0000000092900000| 0%| F| |TAMS 0x0000000092800000, 0x0000000092800000| Untracked +| 297|0x0000000092900000, 0x0000000092900000, 0x0000000092a00000| 0%| F| |TAMS 0x0000000092900000, 0x0000000092900000| Untracked +| 298|0x0000000092a00000, 0x0000000092a00000, 0x0000000092b00000| 0%| F| |TAMS 0x0000000092a00000, 0x0000000092a00000| Untracked +| 299|0x0000000092b00000, 0x0000000092b00000, 0x0000000092c00000| 0%| F| |TAMS 0x0000000092b00000, 0x0000000092b00000| Untracked +| 300|0x0000000092c00000, 0x0000000092c00000, 0x0000000092d00000| 0%| F| |TAMS 0x0000000092c00000, 0x0000000092c00000| Untracked +| 301|0x0000000092d00000, 0x0000000092d00000, 0x0000000092e00000| 0%| F| |TAMS 0x0000000092d00000, 0x0000000092d00000| Untracked +| 302|0x0000000092e00000, 0x0000000092e00000, 0x0000000092f00000| 0%| F| |TAMS 0x0000000092e00000, 0x0000000092e00000| Untracked +| 303|0x0000000092f00000, 0x0000000092f00000, 0x0000000093000000| 0%| F| |TAMS 0x0000000092f00000, 0x0000000092f00000| Untracked +| 304|0x0000000093000000, 0x0000000093000000, 0x0000000093100000| 0%| F| |TAMS 0x0000000093000000, 0x0000000093000000| Untracked +| 305|0x0000000093100000, 0x0000000093100000, 0x0000000093200000| 0%| F| |TAMS 0x0000000093100000, 0x0000000093100000| Untracked +| 306|0x0000000093200000, 0x0000000093200000, 0x0000000093300000| 0%| F| |TAMS 0x0000000093200000, 0x0000000093200000| Untracked +| 307|0x0000000093300000, 0x0000000093300000, 0x0000000093400000| 0%| F| |TAMS 0x0000000093300000, 0x0000000093300000| Untracked +| 308|0x0000000093400000, 0x0000000093400000, 0x0000000093500000| 0%| F| |TAMS 0x0000000093400000, 0x0000000093400000| Untracked +| 309|0x0000000093500000, 0x0000000093500000, 0x0000000093600000| 0%| F| |TAMS 0x0000000093500000, 0x0000000093500000| Untracked +| 310|0x0000000093600000, 0x0000000093600000, 0x0000000093700000| 0%| F| |TAMS 0x0000000093600000, 0x0000000093600000| Untracked +| 311|0x0000000093700000, 0x0000000093700000, 0x0000000093800000| 0%| F| |TAMS 0x0000000093700000, 0x0000000093700000| Untracked +| 312|0x0000000093800000, 0x0000000093800000, 0x0000000093900000| 0%| F| |TAMS 0x0000000093800000, 0x0000000093800000| Untracked +| 313|0x0000000093900000, 0x0000000093900000, 0x0000000093a00000| 0%| F| |TAMS 0x0000000093900000, 0x0000000093900000| Untracked +| 314|0x0000000093a00000, 0x0000000093a00000, 0x0000000093b00000| 0%| F| |TAMS 0x0000000093a00000, 0x0000000093a00000| Untracked +| 315|0x0000000093b00000, 0x0000000093b00000, 0x0000000093c00000| 0%| F| |TAMS 0x0000000093b00000, 0x0000000093b00000| Untracked +| 316|0x0000000093c00000, 0x0000000093c00000, 0x0000000093d00000| 0%| F| |TAMS 0x0000000093c00000, 0x0000000093c00000| Untracked +| 317|0x0000000093d00000, 0x0000000093d00000, 0x0000000093e00000| 0%| F| |TAMS 0x0000000093d00000, 0x0000000093d00000| Untracked +| 318|0x0000000093e00000, 0x0000000093e00000, 0x0000000093f00000| 0%| F| |TAMS 0x0000000093e00000, 0x0000000093e00000| Untracked +| 319|0x0000000093f00000, 0x0000000093f00000, 0x0000000094000000| 0%| F| |TAMS 0x0000000093f00000, 0x0000000093f00000| Untracked +| 320|0x0000000094000000, 0x0000000094000000, 0x0000000094100000| 0%| F| |TAMS 0x0000000094000000, 0x0000000094000000| Untracked +| 321|0x0000000094100000, 0x0000000094100000, 0x0000000094200000| 0%| F| |TAMS 0x0000000094100000, 0x0000000094100000| Untracked +| 322|0x0000000094200000, 0x0000000094200000, 0x0000000094300000| 0%| F| |TAMS 0x0000000094200000, 0x0000000094200000| Untracked +| 323|0x0000000094300000, 0x0000000094300000, 0x0000000094400000| 0%| F| |TAMS 0x0000000094300000, 0x0000000094300000| Untracked +| 324|0x0000000094400000, 0x000000009447a3d8, 0x0000000094500000| 47%| S|CS|TAMS 0x0000000094400000, 0x0000000094400000| Complete +| 325|0x0000000094500000, 0x0000000094600000, 0x0000000094600000|100%| S|CS|TAMS 0x0000000094500000, 0x0000000094500000| Complete +| 326|0x0000000094600000, 0x0000000094700000, 0x0000000094700000|100%| S|CS|TAMS 0x0000000094600000, 0x0000000094600000| Complete +| 327|0x0000000094700000, 0x0000000094800000, 0x0000000094800000|100%| S|CS|TAMS 0x0000000094700000, 0x0000000094700000| Complete +| 328|0x0000000094800000, 0x0000000094900000, 0x0000000094900000|100%| S|CS|TAMS 0x0000000094800000, 0x0000000094800000| Complete +| 329|0x0000000094900000, 0x0000000094a00000, 0x0000000094a00000|100%| S|CS|TAMS 0x0000000094900000, 0x0000000094900000| Complete +| 330|0x0000000094a00000, 0x0000000094b00000, 0x0000000094b00000|100%| S|CS|TAMS 0x0000000094a00000, 0x0000000094a00000| Complete +| 331|0x0000000094b00000, 0x0000000094c00000, 0x0000000094c00000|100%| S|CS|TAMS 0x0000000094b00000, 0x0000000094b00000| Complete +| 332|0x0000000094c00000, 0x0000000094c00000, 0x0000000094d00000| 0%| F| |TAMS 0x0000000094c00000, 0x0000000094c00000| Untracked +| 333|0x0000000094d00000, 0x0000000094d00000, 0x0000000094e00000| 0%| F| |TAMS 0x0000000094d00000, 0x0000000094d00000| Untracked +| 334|0x0000000094e00000, 0x0000000094e00000, 0x0000000094f00000| 0%| F| |TAMS 0x0000000094e00000, 0x0000000094e00000| Untracked +| 335|0x0000000094f00000, 0x0000000094f00000, 0x0000000095000000| 0%| F| |TAMS 0x0000000094f00000, 0x0000000094f00000| Untracked +| 336|0x0000000095000000, 0x0000000095000000, 0x0000000095100000| 0%| F| |TAMS 0x0000000095000000, 0x0000000095000000| Untracked +| 337|0x0000000095100000, 0x0000000095100000, 0x0000000095200000| 0%| F| |TAMS 0x0000000095100000, 0x0000000095100000| Untracked +| 338|0x0000000095200000, 0x0000000095200000, 0x0000000095300000| 0%| F| |TAMS 0x0000000095200000, 0x0000000095200000| Untracked +| 339|0x0000000095300000, 0x0000000095300000, 0x0000000095400000| 0%| F| |TAMS 0x0000000095300000, 0x0000000095300000| Untracked +| 340|0x0000000095400000, 0x0000000095400000, 0x0000000095500000| 0%| F| |TAMS 0x0000000095400000, 0x0000000095400000| Untracked +| 341|0x0000000095500000, 0x0000000095500000, 0x0000000095600000| 0%| F| |TAMS 0x0000000095500000, 0x0000000095500000| Untracked +| 342|0x0000000095600000, 0x0000000095600000, 0x0000000095700000| 0%| F| |TAMS 0x0000000095600000, 0x0000000095600000| Untracked +| 343|0x0000000095700000, 0x0000000095700000, 0x0000000095800000| 0%| F| |TAMS 0x0000000095700000, 0x0000000095700000| Untracked +| 344|0x0000000095800000, 0x0000000095800000, 0x0000000095900000| 0%| F| |TAMS 0x0000000095800000, 0x0000000095800000| Untracked +| 345|0x0000000095900000, 0x0000000095900000, 0x0000000095a00000| 0%| F| |TAMS 0x0000000095900000, 0x0000000095900000| Untracked +| 346|0x0000000095a00000, 0x0000000095a00000, 0x0000000095b00000| 0%| F| |TAMS 0x0000000095a00000, 0x0000000095a00000| Untracked +| 347|0x0000000095b00000, 0x0000000095b00000, 0x0000000095c00000| 0%| F| |TAMS 0x0000000095b00000, 0x0000000095b00000| Untracked +| 348|0x0000000095c00000, 0x0000000095c00000, 0x0000000095d00000| 0%| F| |TAMS 0x0000000095c00000, 0x0000000095c00000| Untracked +| 349|0x0000000095d00000, 0x0000000095d00000, 0x0000000095e00000| 0%| F| |TAMS 0x0000000095d00000, 0x0000000095d00000| Untracked +| 350|0x0000000095e00000, 0x0000000095e00000, 0x0000000095f00000| 0%| F| |TAMS 0x0000000095e00000, 0x0000000095e00000| Untracked +| 351|0x0000000095f00000, 0x0000000095f00000, 0x0000000096000000| 0%| F| |TAMS 0x0000000095f00000, 0x0000000095f00000| Untracked +| 352|0x0000000096000000, 0x0000000096000000, 0x0000000096100000| 0%| F| |TAMS 0x0000000096000000, 0x0000000096000000| Untracked +| 353|0x0000000096100000, 0x0000000096100000, 0x0000000096200000| 0%| F| |TAMS 0x0000000096100000, 0x0000000096100000| Untracked +| 354|0x0000000096200000, 0x0000000096200000, 0x0000000096300000| 0%| F| |TAMS 0x0000000096200000, 0x0000000096200000| Untracked +| 355|0x0000000096300000, 0x0000000096300000, 0x0000000096400000| 0%| F| |TAMS 0x0000000096300000, 0x0000000096300000| Untracked +| 356|0x0000000096400000, 0x0000000096400000, 0x0000000096500000| 0%| F| |TAMS 0x0000000096400000, 0x0000000096400000| Untracked +| 357|0x0000000096500000, 0x0000000096500000, 0x0000000096600000| 0%| F| |TAMS 0x0000000096500000, 0x0000000096500000| Untracked +| 358|0x0000000096600000, 0x0000000096600000, 0x0000000096700000| 0%| F| |TAMS 0x0000000096600000, 0x0000000096600000| Untracked +| 359|0x0000000096700000, 0x0000000096700000, 0x0000000096800000| 0%| F| |TAMS 0x0000000096700000, 0x0000000096700000| Untracked +| 360|0x0000000096800000, 0x0000000096800000, 0x0000000096900000| 0%| F| |TAMS 0x0000000096800000, 0x0000000096800000| Untracked +| 361|0x0000000096900000, 0x0000000096900000, 0x0000000096a00000| 0%| F| |TAMS 0x0000000096900000, 0x0000000096900000| Untracked +| 362|0x0000000096a00000, 0x0000000096a00000, 0x0000000096b00000| 0%| F| |TAMS 0x0000000096a00000, 0x0000000096a00000| Untracked +| 363|0x0000000096b00000, 0x0000000096b00000, 0x0000000096c00000| 0%| F| |TAMS 0x0000000096b00000, 0x0000000096b00000| Untracked +| 364|0x0000000096c00000, 0x0000000096c00000, 0x0000000096d00000| 0%| F| |TAMS 0x0000000096c00000, 0x0000000096c00000| Untracked +| 365|0x0000000096d00000, 0x0000000096d00000, 0x0000000096e00000| 0%| F| |TAMS 0x0000000096d00000, 0x0000000096d00000| Untracked +| 366|0x0000000096e00000, 0x0000000096e00000, 0x0000000096f00000| 0%| F| |TAMS 0x0000000096e00000, 0x0000000096e00000| Untracked +| 367|0x0000000096f00000, 0x0000000096f00000, 0x0000000097000000| 0%| F| |TAMS 0x0000000096f00000, 0x0000000096f00000| Untracked +| 368|0x0000000097000000, 0x0000000097000000, 0x0000000097100000| 0%| F| |TAMS 0x0000000097000000, 0x0000000097000000| Untracked +| 369|0x0000000097100000, 0x0000000097100000, 0x0000000097200000| 0%| F| |TAMS 0x0000000097100000, 0x0000000097100000| Untracked +| 370|0x0000000097200000, 0x0000000097200000, 0x0000000097300000| 0%| F| |TAMS 0x0000000097200000, 0x0000000097200000| Untracked +| 371|0x0000000097300000, 0x0000000097300000, 0x0000000097400000| 0%| F| |TAMS 0x0000000097300000, 0x0000000097300000| Untracked +| 372|0x0000000097400000, 0x0000000097400000, 0x0000000097500000| 0%| F| |TAMS 0x0000000097400000, 0x0000000097400000| Untracked +| 373|0x0000000097500000, 0x0000000097500000, 0x0000000097600000| 0%| F| |TAMS 0x0000000097500000, 0x0000000097500000| Untracked +| 374|0x0000000097600000, 0x0000000097600000, 0x0000000097700000| 0%| F| |TAMS 0x0000000097600000, 0x0000000097600000| Untracked +| 375|0x0000000097700000, 0x0000000097700000, 0x0000000097800000| 0%| F| |TAMS 0x0000000097700000, 0x0000000097700000| Untracked +| 376|0x0000000097800000, 0x0000000097800000, 0x0000000097900000| 0%| F| |TAMS 0x0000000097800000, 0x0000000097800000| Untracked +| 377|0x0000000097900000, 0x0000000097900000, 0x0000000097a00000| 0%| F| |TAMS 0x0000000097900000, 0x0000000097900000| Untracked +| 378|0x0000000097a00000, 0x0000000097a00000, 0x0000000097b00000| 0%| F| |TAMS 0x0000000097a00000, 0x0000000097a00000| Untracked +| 379|0x0000000097b00000, 0x0000000097b00000, 0x0000000097c00000| 0%| F| |TAMS 0x0000000097b00000, 0x0000000097b00000| Untracked +| 380|0x0000000097c00000, 0x0000000097c00000, 0x0000000097d00000| 0%| F| |TAMS 0x0000000097c00000, 0x0000000097c00000| Untracked +| 381|0x0000000097d00000, 0x0000000097d00000, 0x0000000097e00000| 0%| F| |TAMS 0x0000000097d00000, 0x0000000097d00000| Untracked +| 382|0x0000000097e00000, 0x0000000097e00000, 0x0000000097f00000| 0%| F| |TAMS 0x0000000097e00000, 0x0000000097e00000| Untracked +| 383|0x0000000097f00000, 0x0000000097f00000, 0x0000000098000000| 0%| F| |TAMS 0x0000000097f00000, 0x0000000097f00000| Untracked + +Card table byte_map: [0x000001c7d4390000,0x000001c7d4790000] _byte_map_base: 0x000001c7d3f90000 + +Marking Bits (Prev, Next): (CMBitMap*) 0x000001c7c1020070, (CMBitMap*) 0x000001c7c1020038 + Prev Bits: [0x000001c7d6b90000, 0x000001c7d8b90000) + Next Bits: [0x000001c7d4b90000, 0x000001c7d6b90000) + +Polling page: 0x000001c7bf660000 + +Metaspace: + +Usage: + Non-class: 219.20 MB capacity, 213.88 MB ( 98%) used, 4.56 MB ( 2%) free+waste, 776.13 KB ( <1%) overhead. + Class: 32.37 MB capacity, 29.51 MB ( 91%) used, 2.52 MB ( 8%) free+waste, 349.50 KB ( 1%) overhead. + Both: 251.57 MB capacity, 243.39 MB ( 97%) used, 7.09 MB ( 3%) free+waste, 1.10 MB ( <1%) overhead. + +Virtual space: + Non-class space: 220.00 MB reserved, 219.43 MB (>99%) committed + Class space: 1.00 GB reserved, 32.45 MB ( 3%) committed + Both: 1.21 GB reserved, 251.88 MB ( 20%) committed + +Chunk freelists: + Non-Class: 36.00 KB + Class: 4.00 KB + Both: 40.00 KB + +MaxMetaspaceSize: 17179869184.00 GB +CompressedClassSpaceSize: 1.00 GB + +CodeHeap 'non-profiled nmethods': size=120064Kb used=31042Kb max_used=31042Kb free=89022Kb + bounds [0x000001c7cc420000, 0x000001c7ce310000, 0x000001c7d3960000] +CodeHeap 'profiled nmethods': size=120000Kb used=69951Kb max_used=74071Kb free=50048Kb + bounds [0x000001c7c4ef0000, 0x000001c7c97a0000, 0x000001c7cc420000] +CodeHeap 'non-nmethods': size=5696Kb used=2434Kb max_used=2533Kb free=3262Kb + bounds [0x000001c7c4960000, 0x000001c7c4bf0000, 0x000001c7c4ef0000] + total_blobs=33610 nmethods=32524 adapters=996 + compilation: enabled + stopped_count=0, restarted_count=0 + full_count=0 + +Compilation events (20 events): +Event: 658.946 Thread 0x000001c7dbacf800 42400 2 kotlin.io.LinesSequence$iterator$1::hasNext (53 bytes) +Event: 658.947 Thread 0x000001c7dbacf800 nmethod 42400 0x000001c7c80fcc90 code [0x000001c7c80fce40, 0x000001c7c80fd008] +Event: 658.947 Thread 0x000001c7dbacf800 42401 2 kotlin.io.LinesSequence$iterator$1::next (5 bytes) +Event: 658.947 Thread 0x000001c7dbacf800 nmethod 42401 0x000001c7c80fdd10 code [0x000001c7c80fdec0, 0x000001c7c80fdfc8] +Event: 658.947 Thread 0x000001c7dbacf800 42402 2 kotlin.io.LinesSequence$iterator$1::next (40 bytes) +Event: 658.947 Thread 0x000001c7dbacf800 nmethod 42402 0x000001c7c81a6e10 code [0x000001c7c81a7020, 0x000001c7c81a73a8] +Event: 658.947 Thread 0x000001c7dbacf800 42403 2 kotlin.io.FilesKt__FileReadWriteKt$readLines$1::invoke (12 bytes) +Event: 658.948 Thread 0x000001c7dbacf800 nmethod 42403 0x000001c7c814d390 code [0x000001c7c814d560, 0x000001c7c814d6f8] +Event: 658.948 Thread 0x000001c7dbacf800 42404 2 kotlin.io.FilesKt__FileReadWriteKt$readLines$1::invoke (16 bytes) +Event: 658.948 Thread 0x000001c7dbacf800 nmethod 42404 0x000001c7c8176a10 code [0x000001c7c8176be0, 0x000001c7c8176d38] +Event: 658.948 Thread 0x000001c7dbacf800 42405 2 kotlin.text.StringsKt__StringsJVMKt::startsWith$default (15 bytes) +Event: 658.948 Thread 0x000001c7dbacf800 nmethod 42405 0x000001c7c8151c10 code [0x000001c7c8151dc0, 0x000001c7c8151ec8] +Event: 658.948 Thread 0x000001c7dbacf800 42406 2 kotlin.text.StringsKt__StringsJVMKt::startsWith (37 bytes) +Event: 658.949 Thread 0x000001c7dbacf800 nmethod 42406 0x000001c7c81af110 code [0x000001c7c81af360, 0x000001c7c81af838] +Event: 658.949 Thread 0x000001c7dbacf800 42407 2 android.databinding.tool.store.BindingAdapterStore::androidSupportArtifact (10 bytes) +Event: 658.949 Thread 0x000001c7dbacf800 nmethod 42407 0x000001c7c8176690 code [0x000001c7c8176840, 0x000001c7c8176968] +Event: 658.952 Thread 0x000001c7dbacf800 42408 2 java.util.concurrent.atomic.AtomicReference::getAndSet (9 bytes) +Event: 658.952 Thread 0x000001c7dbacf800 nmethod 42408 0x000001c7c81b5f10 code [0x000001c7c81b6120, 0x000001c7c81b65f8] +Event: 658.953 Thread 0x000001c7dbacf800 42409 2 java.lang.invoke.VarHandleObjects$FieldInstanceReadWrite::getAndSet (30 bytes) +Event: 658.953 Thread 0x000001c7dbacf800 nmethod 42409 0x000001c7c81b5610 code [0x000001c7c81b5820, 0x000001c7c81b5c88] + +GC Heap History (20 events): +Event: 654.429 GC heap after +{Heap after GC invocations=217 (full 0): + garbage-first heap total 393216K, used 201319K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 2 young (2048K), 2 survivors (2048K) + Metaspace used 239003K, capacity 247291K, committed 247552K, reserved 1265664K + class space used 29206K, capacity 32052K, committed 32076K, reserved 1048576K +} +Event: 654.624 GC heap before +{Heap before GC invocations=218 (full 0): + garbage-first heap total 393216K, used 306791K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 105 young (107520K), 2 survivors (2048K) + Metaspace used 239004K, capacity 247291K, committed 247552K, reserved 1265664K + class space used 29206K, capacity 32052K, committed 32076K, reserved 1048576K +} +Event: 654.628 GC heap after +{Heap after GC invocations=219 (full 0): + garbage-first heap total 393216K, used 202981K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 3 young (3072K), 3 survivors (3072K) + Metaspace used 239004K, capacity 247291K, committed 247552K, reserved 1265664K + class space used 29206K, capacity 32052K, committed 32076K, reserved 1048576K +} +Event: 654.653 GC heap before +{Heap before GC invocations=219 (full 0): + garbage-first heap total 393216K, used 219365K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 19 young (19456K), 3 survivors (3072K) + Metaspace used 239004K, capacity 247291K, committed 247552K, reserved 1265664K + class space used 29206K, capacity 32052K, committed 32076K, reserved 1048576K +} +Event: 654.660 GC heap after +{Heap after GC invocations=220 (full 0): + garbage-first heap total 393216K, used 203041K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 1 young (1024K), 1 survivors (1024K) + Metaspace used 239004K, capacity 247291K, committed 247552K, reserved 1265664K + class space used 29206K, capacity 32052K, committed 32076K, reserved 1048576K +} +Event: 654.876 GC heap before +{Heap before GC invocations=220 (full 0): + garbage-first heap total 393216K, used 302369K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 99 young (101376K), 1 survivors (1024K) + Metaspace used 239005K, capacity 247291K, committed 247552K, reserved 1265664K + class space used 29206K, capacity 32052K, committed 32076K, reserved 1048576K +} +Event: 654.881 GC heap after +{Heap after GC invocations=221 (full 0): + garbage-first heap total 393216K, used 202442K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 3 young (3072K), 3 survivors (3072K) + Metaspace used 239005K, capacity 247291K, committed 247552K, reserved 1265664K + class space used 29206K, capacity 32052K, committed 32076K, reserved 1048576K +} +Event: 655.757 GC heap before +{Heap before GC invocations=222 (full 0): + garbage-first heap total 393216K, used 292554K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 84 young (86016K), 3 survivors (3072K) + Metaspace used 240774K, capacity 249126K, committed 249344K, reserved 1265664K + class space used 29288K, capacity 32207K, committed 32332K, reserved 1048576K +} +Event: 655.766 GC heap after +{Heap after GC invocations=223 (full 0): + garbage-first heap total 393216K, used 212985K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 8 young (8192K), 8 survivors (8192K) + Metaspace used 240774K, capacity 249126K, committed 249344K, reserved 1265664K + class space used 29288K, capacity 32207K, committed 32332K, reserved 1048576K +} +Event: 655.802 GC heap before +{Heap before GC invocations=223 (full 0): + garbage-first heap total 393216K, used 224249K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 19 young (19456K), 8 survivors (8192K) + Metaspace used 240775K, capacity 249126K, committed 249344K, reserved 1265664K + class space used 29288K, capacity 32207K, committed 32332K, reserved 1048576K +} +Event: 655.810 GC heap after +{Heap after GC invocations=224 (full 0): + garbage-first heap total 393216K, used 213252K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 1 young (1024K), 1 survivors (1024K) + Metaspace used 240775K, capacity 249126K, committed 249344K, reserved 1265664K + class space used 29288K, capacity 32207K, committed 32332K, reserved 1048576K +} +Event: 655.937 GC heap before +{Heap before GC invocations=224 (full 0): + garbage-first heap total 393216K, used 239876K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 29 young (29696K), 1 survivors (1024K) + Metaspace used 241128K, capacity 249546K, committed 249856K, reserved 1267712K + class space used 29317K, capacity 32240K, committed 32332K, reserved 1048576K +} +Event: 655.942 GC heap after +{Heap after GC invocations=225 (full 0): + garbage-first heap total 393216K, used 211470K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 2 young (2048K), 2 survivors (2048K) + Metaspace used 241128K, capacity 249546K, committed 249856K, reserved 1267712K + class space used 29317K, capacity 32240K, committed 32332K, reserved 1048576K +} +Event: 657.363 GC heap before +{Heap before GC invocations=226 (full 0): + garbage-first heap total 393216K, used 325134K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 109 young (111616K), 2 survivors (2048K) + Metaspace used 243862K, capacity 252243K, committed 252416K, reserved 1269760K + class space used 29586K, capacity 32515K, committed 32588K, reserved 1048576K +} +Event: 657.376 GC heap after +{Heap after GC invocations=227 (full 0): + garbage-first heap total 393216K, used 227246K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 14 young (14336K), 14 survivors (14336K) + Metaspace used 243862K, capacity 252243K, committed 252416K, reserved 1269760K + class space used 29586K, capacity 32515K, committed 32588K, reserved 1048576K +} +Event: 657.425 GC heap before +{Heap before GC invocations=227 (full 0): + garbage-first heap total 393216K, used 231342K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 19 young (19456K), 14 survivors (14336K) + Metaspace used 243863K, capacity 252243K, committed 252416K, reserved 1269760K + class space used 29586K, capacity 32515K, committed 32588K, reserved 1048576K +} +Event: 657.438 GC heap after +{Heap after GC invocations=228 (full 0): + garbage-first heap total 393216K, used 227814K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 3 young (3072K), 3 survivors (3072K) + Metaspace used 243863K, capacity 252243K, committed 252416K, reserved 1269760K + class space used 29586K, capacity 32515K, committed 32588K, reserved 1048576K +} +Event: 657.962 GC heap before +{Heap before GC invocations=228 (full 0): + garbage-first heap total 393216K, used 311782K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 87 young (89088K), 3 survivors (3072K) + Metaspace used 245297K, capacity 253669K, committed 253952K, reserved 1269760K + class space used 29800K, capacity 32712K, committed 32844K, reserved 1048576K +} +Event: 657.991 GC heap after +{Heap after GC invocations=229 (full 0): + garbage-first heap total 393216K, used 268288K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 12 young (12288K), 12 survivors (12288K) + Metaspace used 245297K, capacity 253669K, committed 253952K, reserved 1269760K + class space used 29800K, capacity 32712K, committed 32844K, reserved 1048576K +} +Event: 658.961 GC heap before +{Heap before GC invocations=230 (full 0): + garbage-first heap total 393216K, used 324608K [0x0000000080000000, 0x0000000100000000) + region size 1024K, 64 young (65536K), 12 survivors (12288K) + Metaspace used 249230K, capacity 257612K, committed 257920K, reserved 1273856K + class space used 30216K, capacity 33148K, committed 33228K, reserved 1048576K +} + +Deoptimization events (20 events): +Event: 658.495 Thread 0x000001c7ee9a5800 DEOPT PACKING pc=0x000001c7ce2c7fec sp=0x00000014cf3faa80 +Event: 658.495 Thread 0x000001c7ee9a5800 DEOPT UNPACKING pc=0x000001c7c49874af sp=0x00000014cf3faad8 mode 2 +Event: 658.596 Thread 0x000001c7ee9a5800 DEOPT PACKING pc=0x000001c7c7fe2eae sp=0x00000014cf3fb940 +Event: 658.596 Thread 0x000001c7ee9a5800 DEOPT UNPACKING pc=0x000001c7c49872ce sp=0x00000014cf3fae80 mode 0 +Event: 658.675 Thread 0x000001c7ee9a5800 Uncommon trap: trap_request=0xffffff4d fr.pc=0x000001c7cd7e7a78 relative=0x00000000000000d8 +Event: 658.675 Thread 0x000001c7ee9a5800 Uncommon trap: reason=unstable_if action=reinterpret pc=0x000001c7cd7e7a78 method=java.util.BitSet.nextSetBit(I)I @ 45 c2 +Event: 658.675 Thread 0x000001c7ee9a5800 DEOPT PACKING pc=0x000001c7cd7e7a78 sp=0x00000014cf3fbef0 +Event: 658.675 Thread 0x000001c7ee9a5800 DEOPT UNPACKING pc=0x000001c7c49874af sp=0x00000014cf3fbe80 mode 2 +Event: 658.851 Thread 0x000001c7ee9a5800 Uncommon trap: trap_request=0xffffff4d fr.pc=0x000001c7cddb951c relative=0x000000000000083c +Event: 658.851 Thread 0x000001c7ee9a5800 Uncommon trap: reason=unstable_if action=reinterpret pc=0x000001c7cddb951c method=sun.nio.fs.WindowsPath.compareTo(Ljava/nio/file/Path;)I @ 97 c2 +Event: 658.851 Thread 0x000001c7ee9a5800 DEOPT PACKING pc=0x000001c7cddb951c sp=0x00000014cf3fc3e0 +Event: 658.852 Thread 0x000001c7ee9a5800 DEOPT UNPACKING pc=0x000001c7c49874af sp=0x00000014cf3fc368 mode 2 +Event: 658.865 Thread 0x000001c7ee9a5800 DEOPT PACKING pc=0x000001c7c739b379 sp=0x00000014cf3fba80 +Event: 658.865 Thread 0x000001c7ee9a5800 DEOPT UNPACKING pc=0x000001c7c49872ce sp=0x00000014cf3faf98 mode 0 +Event: 658.927 Thread 0x000001c7ee9a5800 DEOPT PACKING pc=0x000001c7c8ca58c0 sp=0x00000014cf3fca90 +Event: 658.927 Thread 0x000001c7ee9a5800 DEOPT UNPACKING pc=0x000001c7c49872ce sp=0x00000014cf3fc020 mode 0 +Event: 658.949 Thread 0x000001c7ee9a5800 Uncommon trap: trap_request=0xffffffde fr.pc=0x000001c7ce2f2cec relative=0x0000000000004a2c +Event: 658.949 Thread 0x000001c7ee9a5800 Uncommon trap: reason=class_check action=maybe_recompile pc=0x000001c7ce2f2cec method=org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement()Z @ 312 c2 +Event: 658.949 Thread 0x000001c7ee9a5800 DEOPT PACKING pc=0x000001c7ce2f2cec sp=0x00000014cf3fc5b0 +Event: 658.949 Thread 0x000001c7ee9a5800 DEOPT UNPACKING pc=0x000001c7c49874af sp=0x00000014cf3fc5b8 mode 2 + +Classes redefined (0 events): +No events + +Internal exceptions (20 events): +Event: 658.800 Thread 0x000001c7ee9a5800 Exception (0x000000009629cc10) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.800 Thread 0x000001c7ee9a5800 Exception (0x000000009629de40) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.801 Thread 0x000001c7ee99c800 Exception (0x0000000096122e88) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.804 Thread 0x000001c788f7b800 Exception (0x0000000096178b40) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.815 Thread 0x000001c7ee9a5800 Exception (0x0000000096020688) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.815 Thread 0x000001c7ee9a5800 Exception (0x00000000960210e0) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.818 Thread 0x000001c788f84800 Exception (0x0000000096018230) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.820 Thread 0x000001c7ee99c800 Exception (0x00000000960a8cf0) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.835 Thread 0x000001c7ee99c800 Exception (0x0000000095f0a120) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.839 Thread 0x000001c788f84800 Exception (0x0000000095fd7988) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.851 Thread 0x000001c7ee9a5800 Exception (0x0000000095e51fe0) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.852 Thread 0x000001c7ee99c800 Exception (0x0000000095e92620) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.853 Thread 0x000001c7ee9a5800 Exception (0x0000000095e52a60) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.856 Thread 0x000001c7ee9a5800 Exception (0x0000000095e6f368) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.856 Thread 0x000001c7ee9a5800 Exception (0x0000000095e6fdd8) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.885 Thread 0x000001c7ee99c800 Exception (0x0000000095c1fc50) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.898 Thread 0x000001c788f84800 Exception (0x000000009580b688) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.898 Thread 0x000001c788f7f800 Exception (0x00000000958b1240) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.907 Thread 0x000001c788f7a800 Exception (0x00000000957b5708) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] +Event: 658.912 Thread 0x000001c7ee99c800 Exception (0x00000000955319d8) thrown at [./src/hotspot/share/prims/jni.cpp, line 615] + +Events (20 events): +Event: 658.853 loading class android/databinding/tool/writer/MergedBindingMapperWriter +Event: 658.853 loading class android/databinding/tool/writer/MergedBindingMapperWriter done +Event: 658.854 loading class android/databinding/tool/writer/MergedBindingMapperWriter$Companion +Event: 658.854 loading class android/databinding/tool/writer/MergedBindingMapperWriter$Companion done +Event: 658.862 loading class com/sun/tools/javac/code/Symtab +Event: 658.862 loading class com/sun/tools/javac/code/Symtab done +Event: 658.934 loading class com/android/build/gradle/internal/tasks/CheckDuplicatesRunnable +Event: 658.934 loading class com/android/build/gradle/internal/tasks/CheckDuplicatesRunnable done +Event: 658.934 loading class com/android/build/gradle/internal/tasks/CheckDuplicateClassesTask$doTaskAction$1 +Event: 658.934 loading class com/android/build/gradle/internal/tasks/CheckDuplicateClassesTask$doTaskAction$1 done +Event: 658.935 loading class com/android/build/gradle/internal/tasks/CheckDuplicatesParams +Event: 658.935 loading class com/android/build/gradle/internal/tasks/CheckDuplicatesParams done +Event: 658.940 Thread 0x000001c7ee9a0800 Thread added: 0x000001c7ee9a0800 +Event: 658.940 Executing VM operation: RevokeBias +Event: 658.941 Executing VM operation: RevokeBias done +Event: 658.943 loading class com/android/build/gradle/internal/tasks/CheckDuplicateClassesDelegate +Event: 658.943 loading class com/android/build/gradle/internal/tasks/CheckDuplicateClassesDelegate done +Event: 658.944 loading class kotlin/io/FilesKt__FileReadWriteKt$readLines$1 +Event: 658.944 loading class kotlin/io/FilesKt__FileReadWriteKt$readLines$1 done +Event: 658.961 Executing VM operation: G1CollectForAllocation + + +Dynamic libraries: +0x00007ff7deac0000 - 0x00007ff7deaca000 C:\Program Files\Android\Android Studio\jre\bin\java.exe +0x00007ff8113b0000 - 0x00007ff8115a5000 C:\WINDOWS\SYSTEM32\ntdll.dll +0x00007ff8100b0000 - 0x00007ff81016d000 C:\WINDOWS\System32\KERNEL32.DLL +0x00007ff80ee10000 - 0x00007ff80f0d8000 C:\WINDOWS\System32\KERNELBASE.dll +0x00007ff80ec60000 - 0x00007ff80ed60000 C:\WINDOWS\System32\ucrtbase.dll +0x00007fffeca90000 - 0x00007fffecaa9000 C:\Program Files\Android\Android Studio\jre\bin\jli.dll +0x00007fffecf50000 - 0x00007fffecf67000 C:\Program Files\Android\Android Studio\jre\bin\VCRUNTIME140.dll +0x00007ff80feb0000 - 0x00007ff810050000 C:\WINDOWS\System32\USER32.dll +0x00007ff80f2e0000 - 0x00007ff80f302000 C:\WINDOWS\System32\win32u.dll +0x00007ffffd860000 - 0x00007ffffdafa000 C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.844_none_ca00b6081b84eb1d\COMCTL32.dll +0x00007ff810220000 - 0x00007ff81024a000 C:\WINDOWS\System32\GDI32.dll +0x00007ff810790000 - 0x00007ff81082e000 C:\WINDOWS\System32\msvcrt.dll +0x00007ff80eb50000 - 0x00007ff80ec5b000 C:\WINDOWS\System32\gdi32full.dll +0x00007ff80f240000 - 0x00007ff80f2dd000 C:\WINDOWS\System32\msvcp_win.dll +0x00007ff80fe80000 - 0x00007ff80feb0000 C:\WINDOWS\System32\IMM32.DLL +0x00007fffea210000 - 0x00007fffea2ad000 C:\Program Files\Android\Android Studio\jre\bin\msvcp140.dll +0x00007fffbc3f0000 - 0x00007fffbceac000 C:\Program Files\Android\Android Studio\jre\bin\server\jvm.dll +0x00007ff8108d0000 - 0x00007ff81097c000 C:\WINDOWS\System32\ADVAPI32.dll +0x00007ff810830000 - 0x00007ff8108cb000 C:\WINDOWS\System32\sechost.dll +0x00007ff80f7a0000 - 0x00007ff80f8cb000 C:\WINDOWS\System32\RPCRT4.dll +0x00007ff80f410000 - 0x00007ff80f418000 C:\WINDOWS\System32\PSAPI.DLL +0x00007ff800610000 - 0x00007ff800637000 C:\WINDOWS\SYSTEM32\WINMM.dll +0x00007fffeaf90000 - 0x00007fffeaf99000 C:\WINDOWS\SYSTEM32\WSOCK32.dll +0x00007ff808930000 - 0x00007ff80893a000 C:\WINDOWS\SYSTEM32\VERSION.dll +0x00007ff811150000 - 0x00007ff8111bb000 C:\WINDOWS\System32\WS2_32.dll +0x00007ff80ca50000 - 0x00007ff80ca62000 C:\WINDOWS\SYSTEM32\kernel.appcore.dll +0x00007ff809a70000 - 0x00007ff809a81000 C:\Program Files\Android\Android Studio\jre\bin\verify.dll +0x00007ff807e20000 - 0x00007ff808004000 C:\WINDOWS\SYSTEM32\DBGHELP.DLL +0x00007ff807cb0000 - 0x00007ff807cdc000 C:\WINDOWS\SYSTEM32\dbgcore.DLL +0x00007ff80f340000 - 0x00007ff80f3c0000 C:\WINDOWS\System32\bcryptPrimitives.dll +0x00007ff802450000 - 0x00007ff802479000 C:\Program Files\Android\Android Studio\jre\bin\java.dll +0x00007ff8099f0000 - 0x00007ff8099fb000 C:\Program Files\Android\Android Studio\jre\bin\jimage.dll +0x00007ff800670000 - 0x00007ff800688000 C:\Program Files\Android\Android Studio\jre\bin\zip.dll +0x00007ff810980000 - 0x00007ff8110c2000 C:\WINDOWS\System32\SHELL32.dll +0x00007ff80cc50000 - 0x00007ff80d3e1000 C:\WINDOWS\SYSTEM32\windows.storage.dll +0x00007ff8103d0000 - 0x00007ff810725000 C:\WINDOWS\System32\combase.dll +0x00007ff80e560000 - 0x00007ff80e58c000 C:\WINDOWS\SYSTEM32\Wldp.dll +0x00007ff80f8d0000 - 0x00007ff80f97e000 C:\WINDOWS\System32\SHCORE.dll +0x00007ff810050000 - 0x00007ff8100a5000 C:\WINDOWS\System32\shlwapi.dll +0x00007ff80ea30000 - 0x00007ff80ea4f000 C:\WINDOWS\SYSTEM32\profapi.dll +0x00007ffff8030000 - 0x00007ffff804a000 C:\Program Files\Android\Android Studio\jre\bin\net.dll +0x00007ff804e70000 - 0x00007ff804f7b000 C:\WINDOWS\SYSTEM32\WINHTTP.dll +0x00007ff80e2d0000 - 0x00007ff80e33a000 C:\WINDOWS\system32\mswsock.dll +0x00007ffff0bc0000 - 0x00007ffff0bd4000 C:\Program Files\Android\Android Studio\jre\bin\nio.dll +0x00007ffff0dd0000 - 0x00007ffff0df7000 C:\Users\Schoumi\.gradle\native\fdc75f09e3144964f2cf3f50f0aa648679c211496f362492102eb8c894070792\windows-amd64\native-platform.dll +0x00007fffdd1a0000 - 0x00007fffdd336000 C:\Users\Schoumi\.gradle\native\12488b8bf47d2d4c9fbf2f6322a914ad602e24e48041cd04a747c6da556b65c4\windows-amd64\native-platform-file-events.dll +0x00007ff8093a0000 - 0x00007ff8093aa000 C:\Program Files\Android\Android Studio\jre\bin\management.dll +0x00007ff805e40000 - 0x00007ff805e4c000 C:\Program Files\Android\Android Studio\jre\bin\management_ext.dll +0x00007ff80e4a0000 - 0x00007ff80e4b8000 C:\WINDOWS\SYSTEM32\CRYPTSP.dll +0x00007ff80dc00000 - 0x00007ff80dc34000 C:\WINDOWS\system32\rsaenh.dll +0x00007ff80f310000 - 0x00007ff80f337000 C:\WINDOWS\System32\bcrypt.dll +0x00007ff80e9b0000 - 0x00007ff80e9de000 C:\WINDOWS\SYSTEM32\USERENV.dll +0x00007ff80e4c0000 - 0x00007ff80e4cc000 C:\WINDOWS\SYSTEM32\CRYPTBASE.dll +0x00007ff80df70000 - 0x00007ff80dfab000 C:\WINDOWS\SYSTEM32\IPHLPAPI.DLL +0x00007ff80f790000 - 0x00007ff80f798000 C:\WINDOWS\System32\NSI.dll +0x00007ff807c90000 - 0x00007ff807ca7000 C:\WINDOWS\SYSTEM32\dhcpcsvc6.DLL +0x00007ff8084f0000 - 0x00007ff80850d000 C:\WINDOWS\SYSTEM32\dhcpcsvc.DLL +0x00007ff80dfb0000 - 0x00007ff80e07c000 C:\WINDOWS\SYSTEM32\DNSAPI.dll +0x00007ff808ab0000 - 0x00007ff808abb000 C:\WINDOWS\SYSTEM32\WINNSI.DLL +0x00007fffed850000 - 0x00007fffed877000 C:\Program Files\Android\Android Studio\jre\bin\sunec.dll +0x00007ff804b50000 - 0x00007ff804b5a000 C:\Windows\System32\rasadhlp.dll +0x00007ff804f80000 - 0x00007ff804fff000 C:\WINDOWS\System32\fwpuclnt.dll +0x00007ff80d830000 - 0x00007ff80d863000 C:\WINDOWS\SYSTEM32\ntmarta.dll +0x00007ff80c460000 - 0x00007ff80c4f0000 C:\WINDOWS\system32\apphelp.dll +0x00007ff808040000 - 0x00007ff80805e000 C:\Users\Schoumi\AppData\Local\Temp\native-platform14304933848840957548dir\native-platform.dll +0x00007ffff18c0000 - 0x00007ffff18c8000 C:\Program Files\Android\Android Studio\jre\bin\rmi.dll + +dbghelp: loaded successfully - version: 4.0.5 - missing functions: none +symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;C:\Program Files\Android\Android Studio\jre\bin;C:\WINDOWS\SYSTEM32;C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.844_none_ca00b6081b84eb1d;C:\Program Files\Android\Android Studio\jre\bin\server;C:\Users\Schoumi\.gradle\native\fdc75f09e3144964f2cf3f50f0aa648679c211496f362492102eb8c894070792\windows-amd64;C:\Users\Schoumi\.gradle\native\12488b8bf47d2d4c9fbf2f6322a914ad602e24e48041cd04a747c6da556b65c4\windows-amd64;C:\Users\Schoumi\AppData\Local\Temp\native-platform14304933848840957548dir + +VM Arguments: +jvm_args: --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED -Xmx2048m -Dfile.encoding=windows-1252 -Duser.country=FR -Duser.language=fr -Duser.variant +java_command: org.gradle.launcher.daemon.bootstrap.GradleDaemon 6.7.1 +java_class_path (initial): C:\Users\Schoumi\.gradle\wrapper\dists\gradle-6.7.1-all\2moa8rlfac5eqlcfgk98k0deb\gradle-6.7.1\lib\gradle-launcher-6.7.1.jar +Launcher Type: SUN_STANDARD + +[Global flags] + intx CICompilerCount = 3 {product} {ergonomic} + uint ConcGCThreads = 1 {product} {ergonomic} + uint G1ConcRefinementThreads = 4 {product} {ergonomic} + size_t G1HeapRegionSize = 1048576 {product} {ergonomic} + uintx GCDrainStackTargetSize = 64 {product} {ergonomic} + size_t InitialHeapSize = 402653184 {product} {ergonomic} + size_t MarkStackSize = 4194304 {product} {ergonomic} + size_t MaxHeapSize = 2147483648 {product} {command line} + size_t MaxNewSize = 1287651328 {product} {ergonomic} + size_t MinHeapDeltaBytes = 1048576 {product} {ergonomic} + uintx NonNMethodCodeHeapSize = 5830732 {pd product} {ergonomic} + uintx NonProfiledCodeHeapSize = 122913754 {pd product} {ergonomic} + uintx ProfiledCodeHeapSize = 122913754 {pd product} {ergonomic} + uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} + bool SegmentedCodeCache = true {product} {ergonomic} + bool UseCompressedClassPointers = true {lp64_product} {ergonomic} + bool UseCompressedOops = true {lp64_product} {ergonomic} + bool UseG1GC = true {product} {ergonomic} + bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic} + +Logging: +Log output configuration: + #0: stdout all=warning uptime,level,tags + #1: stderr all=off uptime,level,tags + +Environment Variables: +PATH=C:\Program Files\ImageMagick-7.0.10-Q16-HDRI;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\CMake\bin;C:\Users\Schoumi\AppData\Local\Mu\bin;C:\Users\Schoumi\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Git\bin;C:\Program Files\Java\jdk1.8.0_172\bin;C:\Program Files\ldlc\gradle-4.7\bin;C:\Users\Schoumi\AppData\Local\Programs\Microsoft VS Code\bin +USERNAME=Schoumi +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 94 Stepping 3, GenuineIntel + + + +--------------- S Y S T E M --------------- + +OS: Windows 10 , 64 bit Build 19041 (10.0.19041.928) +OS uptime: 15 days 5:15 hours + +CPU:total 4 (initial active 4) (4 cores per cpu, 1 threads per core) family 6 model 94 stepping 3, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, avx, avx2, aes, clmul, erms, 3dnowpref, lzcnt, tsc, tscinvbit, bmi1, bmi2, adx, fma + +Memory: 4k page, system-wide physical 24501M (6282M free) +TotalPageFile size 52981M (AvailPageFile size 53M) +current process WorkingSet (physical memory assigned to process): 1109M, peak: 1259M +current process commit charge ("private bytes"): 1143M, peak: 1552M + +vm_info: OpenJDK 64-Bit Server VM (11.0.8+10-b944.6842174) for windows-amd64 JRE (11.0.8+10-b944.6842174), built on Sep 19 2020 01:11:42 by "builder" with MS VC++ 14.0 (VS2015) + +END. diff --git a/replay_pid98176.log b/replay_pid98176.log new file mode 100644 index 0000000..ef94a4a --- /dev/null +++ b/replay_pid98176.log @@ -0,0 +1,6676 @@ +JvmtiExport can_access_local_variables 0 +JvmtiExport can_hotswap_or_post_breakpoint 0 +JvmtiExport can_post_on_exceptions 0 +# 426 ciObject found +instanceKlass org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResultsUtil +instanceKlass org/jetbrains/kotlin/contracts/ContextInfoToDataFlowInfoKt +instanceKlass org/jetbrains/kotlin/contracts/model/MutableContextInfo$Companion +instanceKlass org/jetbrains/kotlin/contracts/model/MutableContextInfo +instanceKlass org/jetbrains/kotlin/contracts/model/visitors/InfoCollector +instanceKlass org/jetbrains/kotlin/contracts/model/structure/UNKNOWN_COMPUTATION +instanceKlass org/jetbrains/kotlin/contracts/description/ContractProviderKey +instanceKlass org/jetbrains/kotlin/contracts/model/structure/CallComputation +instanceKlass org/jetbrains/kotlin/contracts/model/structure/TypesKt +instanceKlass org/jetbrains/kotlin/contracts/model/visitors/Reducer +instanceKlass org/jetbrains/kotlin/contracts/model/ESExpressionVisitor +instanceKlass org/jetbrains/kotlin/contracts/model/structure/ESType +instanceKlass org/jetbrains/kotlin/contracts/description/expressions/BooleanConstantReference$Companion +instanceKlass org/jetbrains/kotlin/contracts/description/expressions/ConstantReference$Companion +instanceKlass org/jetbrains/kotlin/contracts/description/expressions/ConstantReference +instanceKlass org/jetbrains/kotlin/contracts/description/expressions/ContractDescriptionValue +instanceKlass org/jetbrains/kotlin/contracts/description/BooleanExpression +instanceKlass org/jetbrains/kotlin/contracts/description/ContractDescriptionElement +instanceKlass org/jetbrains/kotlin/contracts/model/structure/AbstractESValue +instanceKlass org/jetbrains/kotlin/contracts/model/ESValue +instanceKlass org/jetbrains/kotlin/contracts/model/ESExpression +instanceKlass org/jetbrains/kotlin/contracts/model/Computation +instanceKlass org/jetbrains/kotlin/contracts/model/structure/ESConstants +instanceKlass org/jetbrains/kotlin/contracts/model/ESEffect +instanceKlass org/jetbrains/kotlin/resolve/scopes/MemberScopeKt +instanceKlass org/jetbrains/kotlin/resolve/calls/model/KotlinCall$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/calls/CallTransformer +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/AbstractInvokeTowerProcessor +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver$FactoryProviderForInvoke +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/CandidateFactoryProviderForInvoke +instanceKlass org/jetbrains/kotlin/types/TypeIntersector +instanceKlass org/jetbrains/kotlin/resolve/DescriptorResolver$$Lambda$338 +instanceKlass org/jetbrains/kotlin/types/TypeAliasExpansionReportStrategy$DO_NOTHING +instanceKlass org/jetbrains/kotlin/types/TypeAliasExpander$Companion +instanceKlass org/jetbrains/kotlin/types/TypeAliasExpander +instanceKlass org/jetbrains/kotlin/types/TypeAliasExpansion$Companion +instanceKlass org/jetbrains/kotlin/types/TypeAliasExpansion +instanceKlass org/jetbrains/kotlin/resolve/TypeResolver$TracingTypeAliasExpansionReportStrategy +instanceKlass org/jetbrains/kotlin/types/TypeAliasExpansionReportStrategy +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintSystemError +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo$Expression +instanceKlass org/jetbrains/kotlin/resolve/constants/PrimitiveTypeUtilKt +instanceKlass org/jetbrains/kotlin/types/ErrorUtils$ThrowingScope +instanceKlass org/jetbrains/kotlin/resolve/constants/IntegerLiteralTypeConstructor$Companion +instanceKlass org/jetbrains/kotlin/resolve/constants/IntegerValueTypeConstant$Companion +instanceKlass org/jetbrains/kotlin/resolve/constants/CompileTimeConstantKt +instanceKlass javaslang/ValueModule +instanceKlass javaslang/collection/LinkedHashSet$$Lambda$337 +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo$NULL +instanceKlass org/jetbrains/kotlin/descriptors/ConstUtilKt +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo$Receiver +instanceKlass org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData$VarargCheckResult +instanceKlass org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData$$Lambda$336 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData$TypeAndName +instanceKlass org/jetbrains/kotlin/codegen/state/InfoForMangling +instanceKlass org/jetbrains/kotlin/util/Check$DefaultImpls +instanceKlass org/jetbrains/kotlin/kdoc/psi/api/KDoc +instanceKlass org/jetbrains/kotlin/kdoc/psi/api/KDocElement +instanceKlass org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnostic +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ArgumentsUtilsKt$$Lambda$335 +instanceKlass org/jetbrains/kotlin/kapt3/KaptAnonymousTypeTransformerKt +instanceKlass org/jetbrains/kotlin/descriptors/annotations/FilteredAnnotations +instanceKlass org/jetbrains/kotlin/types/AlternativeTypeSubstitutionKt$substituteAlternativesInPublicType$substitutor$1 +instanceKlass org/jetbrains/kotlin/types/AlternativeTypeSubstitutionKt +instanceKlass org/jetbrains/kotlin/resolve/constants/CompileTimeConstant$DefaultImpls +instanceKlass org/jetbrains/kotlin/utils/SmartSet$ArrayIterator +instanceKlass org/jetbrains/kotlin/types/StarProjectionImplKt +instanceKlass org/jetbrains/kotlin/load/java/lazy/types/RawSubstitution$WhenMappings +instanceKlass org/jetbrains/kotlin/types/AbstractTypeChecker$WhenMappings +instanceKlass org/jetbrains/kotlin/builtins/KotlinBuiltIns$Primitives +instanceKlass org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl$1 +instanceKlass org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition$WhenMappings +instanceKlass org/jetbrains/kotlin/codegen/AsmUtil +instanceKlass org/jetbrains/kotlin/load/kotlin/TypeMappingMode$WhenMappings +instanceKlass org/jetbrains/kotlin/resolve/jvm/jvmSignature/JvmMethodParameterSignature +instanceKlass org/jetbrains/kotlin/resolve/jvm/AsmTypes$1 +instanceKlass org/jetbrains/kotlin/resolve/jvm/AsmTypes$$Lambda$334 +instanceKlass org/jetbrains/kotlin/resolve/jvm/AsmTypes +instanceKlass org/jetbrains/kotlin/resolve/OverridingUtil$7 +instanceKlass org/jetbrains/kotlin/resolve/OverridingUtil$6 +instanceKlass org/jetbrains/kotlin/resolve/VisibilityUtilKt +instanceKlass org/jetbrains/kotlin/resolve/BodyResolver$2 +instanceKlass org/jetbrains/kotlin/utils/NumberWithRadix +instanceKlass org/jetbrains/kotlin/utils/NumbersKt +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/LiteralFormatUtil$$Lambda$333 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/text/CharFilter +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/LiteralFormatUtil +instanceKlass org/jetbrains/kotlin/parsing/ParseUtilsKt +instanceKlass org/jetbrains/kotlin/coroutines/CoroutineUtilKt +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/EnhancedTypeAnnotationDescriptor +instanceKlass org/jetbrains/kotlin/resolve/ImplicitIntegerCoercionKt +instanceKlass org/jetbrains/kotlin/resolve/ImplicitIntegerCoercion +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ArgumentMatchImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ArgumentMatch +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ArgumentMapping +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceUtilKt +instanceKlass org/jetbrains/kotlin/builtins/UnsignedTypes +instanceKlass org/jetbrains/kotlin/resolve/calls/components/UnitTypeConversions +instanceKlass org/jetbrains/kotlin/resolve/calls/components/SuspendTypeConversions +instanceKlass org/jetbrains/kotlin/resolve/calls/components/TypeConversions$ConversionData +instanceKlass org/jetbrains/kotlin/resolve/calls/components/SamTypeConversions +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ParameterTypeConversion +instanceKlass org/jetbrains/kotlin/resolve/calls/components/TypeConversions +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ResolvedCallArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper$CallArgumentProcessor +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo$Qualified +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo$PackageOrClass +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/AdditionalTypeChecker$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/SmartCastReceiverValue +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/SmartCastUtilKt +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/CoroutineCallCheckerKt +instanceKlass org/jetbrains/kotlin/resolve/calls/model/PostponedCallableReferenceMarker +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilderKt$addConstraintIfCompatible$1$WhenMappings +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilderKt +instanceKlass org/jetbrains/kotlin/resolve/calls/components/SimpleArgumentsChecksKt +instanceKlass org/jetbrains/kotlin/resolve/calls/components/PostponeArgumentsChecksKt +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ArgumentsUtilsKt +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ResolutionPartsKt +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ReceiverInfo$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ReceiverInfo +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/SuperCallReceiverValue +instanceKlass org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope$SyntheticPropertyHolder$Companion +instanceKlass org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope$SyntheticPropertyHolder +instanceKlass kotlin/properties/NotNullVar +instanceKlass kotlin/properties/Delegates +instanceKlass org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope$MyPropertyDescriptor$Companion +instanceKlass org/jetbrains/kotlin/synthetic/SyntheticExtensionsUtilsKt +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/ClassInnerStuffCache$$Lambda$332 +instanceKlass org/jetbrains/kotlin/synthetic/SyntheticJavaPropertyDescriptor$Companion +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/JavaClassifierTypeImpl$ResolutionResult +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiClassType$ClassResolveResult$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiClassReferenceType$DelegatingClassResolveResult +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl$$Lambda$331 +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/Object2IntOpenHashMap$MapIterator +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/ints/Int2ObjectMap$FastEntrySet +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/ints/IntSet +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/ints/AbstractInt2ObjectFunction +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/Object2IntMap$FastEntrySet +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/ints/IntCollection +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/ints/IntIterable +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/AbstractObject2IntFunction +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/ints/Int2ObjectMap +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/ints/Int2ObjectFunction +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/Object2IntMap +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/Object2IntFunction +instanceKlass java/util/function/ToIntFunction +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/cache/ModifierFlags +instanceKlass org/jetbrains/kotlin/com/intellij/psi/ServerPageFile +instanceKlass org/jetbrains/kotlin/com/intellij/psi/FileResolveScopeProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiJavaFileBaseImpl$$Lambda$330 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/SymbolCollectingProcessor$ResultWithContext +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/JavaResolveUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/infos/CandidateInfo +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/StubSpine +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/MaterialStubList$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/StubBuildingVisitor$AnnotationTextCollector$$Lambda$329 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/StubBuildingVisitor$MethodAnnotationCollectingVisitor$$Lambda$328 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/codeInsight/AnnotationUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/StubBuildingVisitor$MethodAnnotationCollectingVisitor$$Lambda$327 +instanceKlass org/jetbrains/kotlin/com/intellij/util/Consumer +instanceKlass gnu/trove/TIntIntProcedure +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/StubList$2 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/StubBuildingVisitor$$Lambda$326 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/StubBuildingVisitor$MethodInfo +instanceKlass gnu/trove/TObjectIntProcedure +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/cache/TypeInfo +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/SignatureParsing +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/StubBuildingVisitor$ClassInfo +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/StubBuildingVisitor$2 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/StubBuildingVisitor$$Lambda$325 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/ClsModifierListOwner +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/UnsignedShortArrayList +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/MostlyUShortIntList +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/StubList$TempState +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/StubPsiFactory +instanceKlass java/security/CodeSigner +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/ClsParsingUtil$$Lambda$324 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiArrayInitializerMemberValue +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/ClsParsingUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/StubBuilderType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/StubTreeBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/util/indexing/PsiDependentFileContent +instanceKlass org/jetbrains/kotlin/com/intellij/util/indexing/FileContent +instanceKlass org/jetbrains/kotlin/com/intellij/util/indexing/IndexedFile +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/ClsFileImpl$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/InnerClassSourceStrategy +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiCompiledFile +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiCompiledElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiClassOwnerEx +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/impl/ExtensionProcessingHelper$$Lambda$323 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/compiled/ClassFileDecompilers$$Lambda$322 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/compiled/ClassFileDecompilers$Decompiler +instanceKlass org/jetbrains/kotlin/com/intellij/psi/compiled/ClassFileDecompilers +instanceKlass org/jetbrains/kotlin/asJava/classes/ValueWrapper$Companion +instanceKlass org/jetbrains/kotlin/asJava/classes/ValueWrapper +instanceKlass org/jetbrains/kotlin/asJava/classes/FacadeCacheKey +instanceKlass org/jetbrains/kotlin/analyzer/KotlinModificationTrackerService$Companion +instanceKlass org/jetbrains/kotlin/analyzer/KotlinModificationTrackerService +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/hash/EqualityPolicy$2 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/hash/EqualityPolicy$1 +instanceKlass org/jetbrains/kotlin/asJava/classes/FacadeCache$FacadeCacheData +instanceKlass org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade$Companion +instanceKlass org/jetbrains/kotlin/asJava/classes/KtLightClass +instanceKlass org/jetbrains/kotlin/asJava/elements/KtLightDeclaration +instanceKlass org/jetbrains/kotlin/asJava/elements/KtLightElement +instanceKlass org/jetbrains/kotlin/resolve/lazy/ResolveSessionUtils$$Lambda$321 +instanceKlass org/jetbrains/kotlin/resolve/lazy/ResolveSessionUtils +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiJavaFileBaseImpl$MyResolveCacheProcessor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiJavaFileBaseImpl$$Lambda$320 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiJavaFileBaseImpl$$Lambda$319 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ContainerUtil$$Lambda$318 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiImportStaticStatementImpl$$Lambda$317 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiImportStaticStatement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiImportStatementImpl$$Lambda$316 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiImportStatement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiImportListImpl$$Lambda$315 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiImportStatementBase$$Lambda$314 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiJavaFileBaseImpl$$Lambda$313 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/ScopedClassHierarchy$$Lambda$312 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/ScopedClassHierarchy$$Lambda$311 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/ScopedClassHierarchy$$Lambda$310 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/ScopedClassHierarchy$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/ScopedClassHierarchy +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiClassImplUtil$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiClassImplUtil$$Lambda$309 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiClassImplUtil$ByNameCachedValueProvider$$Lambda$308 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiClassImplUtil$MembersMap +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiClassImplUtil$ByNameCachedValueProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/EmptySubstitutor$Holder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/EmptySubstitutor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/scope/JavaScopeProcessorEvent +instanceKlass org/jetbrains/kotlin/com/intellij/psi/ResolveState +instanceKlass org/jetbrains/kotlin/com/intellij/psi/scope/util/PsiScopesUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiResolveHelper$SERVICE +instanceKlass org/jetbrains/kotlin/com/intellij/psi/JavaResolveResult$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/ClassResolverProcessor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/ResolveCache$$Lambda$307 +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/ResolveCache$$Lambda$306 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl$OurGenericsResolver +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiTypeVisitor +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/JavaTypeImpl +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/ClassReferencePointer$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiJavaCodeReferenceElement$$Lambda$305 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiAnonymousClass +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiClassImplUtil$$Lambda$304 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiClassImplUtil$ClassIconRequest +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/ParameterizedCachedValueProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiClassImplUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/ClassInnerStuffCache$$Lambda$303 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiEnumConstant +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiConstructorCall +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmEnumField +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/JavaResolveCache$ConstValueComputer +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiVariableEx +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiField$$Lambda$302 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/ClassInnerStuffCache$$Lambda$301 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaSharedImplUtil$FilteringTypeAnnotationProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/java/PsiAnnotationImpl$$Lambda$300 +instanceKlass org/jetbrains/kotlin/com/intellij/util/PairFunction +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiTypeElementImpl$1 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/SingletonIteratorBase +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/TreeTraversal$P$1 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/TreeTraversal$P$$Lambda$299 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/TreeTraversal$P +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiTypeElementImpl$$Lambda$298 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/util/Functions$2 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/JBIterable$$Lambda$297 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/FilteredTraverserBase$$Lambda$296 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Conditions$8 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Conditions$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/SyntaxTraverser$$Lambda$295 +instanceKlass org/jetbrains/kotlin/com/intellij/util/Function$2 +instanceKlass org/jetbrains/kotlin/com/intellij/util/NullableFunction$1 +instanceKlass org/jetbrains/kotlin/com/intellij/util/Function$1 +instanceKlass org/jetbrains/kotlin/com/intellij/util/Functions$6 +instanceKlass org/jetbrains/kotlin/com/intellij/util/Functions$5 +instanceKlass org/jetbrains/kotlin/com/intellij/util/Functions$4 +instanceKlass org/jetbrains/kotlin/com/intellij/util/Functions +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/FilteredTraverserBase$Cond +instanceKlass org/jetbrains/kotlin/com/intellij/util/NotNullizer +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/TreeTraversal$TraversalInterceptor +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/TreeTraversal$GuidedIt$Guide +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/FilteredTraverserBase$Meta +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/JBIterator$2 +instanceKlass org/jetbrains/kotlin/com/intellij/util/Function$Mono +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/JBIterator$Op +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/JBIterator +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/JBIterable$Stateful +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/JBIterable$$Lambda$294 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiTypeElementImpl$$Lambda$293 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/JBIterable +instanceKlass org/jetbrains/kotlin/com/intellij/psi/SyntaxTraverser$Api$$Lambda$292 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/SyntaxTraverser$ApiEx$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/SyntaxTraverser$Api$3 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/SyntaxTraverser$Api$2 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/SyntaxTraverser$Api$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/SyntaxTraverser$Api +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/TreeTraversal +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/FilteredTraverserBase +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiClassType$$Lambda$291 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiClassType$ClassResolveResult +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/types/JvmTypeResolveResult +instanceKlass org/jetbrains/kotlin/com/intellij/psi/augment/PsiAugmentProvider$$Lambda$290 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiTypeElementImpl$$Lambda$289 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaSharedImplUtil +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/EmptyIterator +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/ClassInnerStuffCache$$Lambda$288 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/augment/PsiAugmentProvider$$Lambda$287 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiMethod$$Lambda$286 +instanceKlass org/jetbrains/kotlin/com/intellij/util/CachedValueLeakChecker +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/CachedValuesManager$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/CachedValuesManager$$Lambda$285 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/ClassInnerStuffCache$$Lambda$284 +instanceKlass org/jetbrains/kotlin/resolve/calls/model/SubKotlinCallArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/model/LambdaKotlinCallArgument +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/QualifierReceiverKt +instanceKlass javaslang/collection/LinkedHashSet$$Lambda$283 +instanceKlass javaslang/Tuple2 +instanceKlass javaslang/Tuple +instanceKlass javaslang/collection/IteratorModule$EmptyIterator +instanceKlass javaslang/collection/AbstractIterator +instanceKlass javaslang/collection/List$Nil +instanceKlass javaslang/collection/List +instanceKlass javaslang/collection/Stack +instanceKlass javaslang/collection/Queue +instanceKlass javaslang/collection/LinearSeq +instanceKlass javaslang/collection/LinkedHashMap +instanceKlass javaslang/collection/LinkedHashSet +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ReceiverExpressionKotlinCallArgument$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ReceiverExpressionKotlinCallArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ExpressionKotlinCallArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/CallExpressionResolver$$Lambda$282 +instanceKlass javaslang/control/Option$None +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueKt +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo$NO +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo$ERROR +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValue$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueKindUtilsKt +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo$Variable +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfo +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/IdentifierInfoKt +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/ExpressionReceiver$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/CallExpressionElement +instanceKlass org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl$$Lambda$281 +instanceKlass java/util/function/BiConsumer +instanceKlass org/jetbrains/kotlin/resolve/BindingContextUtils$$Lambda$280 +instanceKlass org/jetbrains/kotlin/resolve/TraceEntryFilter +instanceKlass org/jetbrains/kotlin/resolve/calls/CallExpressionResolver$elementChain$1$WhenMappings +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryPackageSourceElement +instanceKlass org/jetbrains/kotlin/descriptors/DeclarationDescriptorWithNavigationSubstitute +instanceKlass org/jetbrains/kotlin/resolve/DescriptorToSourceUtils +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/EmptySubstitutor +instanceKlass org/jetbrains/kotlin/resolve/calls/model/SimpleCandidateFactory$WhenMappings +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/CandidateWithBoundDispatchReceiver +instanceKlass org/jetbrains/kotlin/resolve/calls/util/IsFromStdlibJre7Or8Kt +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/TowerLevelsKt +instanceKlass org/jetbrains/kotlin/resolve/scopes/DeprecatedLexicalScope +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/SimpleScopeTowerProcessor$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/AbstractScopeTowerLevel +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerLevel +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/TowerResolver$Task +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/AbstractSimpleScopeTowerProcessor +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/SimpleScopeTowerProcessor +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/PrioritizedCompositeScopeTowerProcessor +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessorsKt +instanceKlass org/jetbrains/kotlin/resolve/calls/KotlinCallResolver$WhenMappings +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass org/jetbrains/kotlin/resolve/calls/CallResolver$$Lambda$279 +instanceKlass org/jetbrains/kotlin/resolve/calls/util/CallMaker$CallImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/context/TemporaryResolutionResultsCache +instanceKlass org/jetbrains/kotlin/resolve/calls/CallExpressionUnrollerKt +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/NewCallArgumentsKt +instanceKlass org/jetbrains/kotlin/resolve/BodyResolver$$Lambda$278 +instanceKlass org/jetbrains/kotlin/resolve/ObservableBindingTrace$RecordHandler +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/util/LookupTrackerUtilKt +instanceKlass org/jetbrains/kotlin/types/ErrorUtils$3 +instanceKlass org/jetbrains/kotlin/resolve/jvm/RuntimeAssertionsDataFlowExtras +instanceKlass org/jetbrains/kotlin/resolve/jvm/RuntimeAssertionInfo$DataFlowExtras +instanceKlass org/jetbrains/kotlin/resolve/jvm/RuntimeAssertionInfo$Companion +instanceKlass org/jetbrains/kotlin/resolve/jvm/RuntimeAssertionInfo +instanceKlass org/jetbrains/kotlin/psi/KtPsiUtil$KtExpressionWrapper +instanceKlass org/jetbrains/kotlin/resolve/constants/CompileTimeConstantChecker +instanceKlass org/jetbrains/kotlin/resolve/constants/IntegerValueTypeConstant +instanceKlass org/jetbrains/kotlin/resolve/constants/UnsignedErrorValueTypeConstant +instanceKlass org/jetbrains/kotlin/resolve/constants/TypedCompileTimeConstant +instanceKlass org/jetbrains/kotlin/resolve/constants/CompileTimeConstant$Parameters +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/AstBufferUtil +instanceKlass org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher$$Lambda$277 +instanceKlass org/jetbrains/kotlin/resolve/scopes/ScopeUtils$$Lambda$276 +instanceKlass org/jetbrains/kotlin/types/expressions/PreliminaryDeclarationVisitor$Companion +instanceKlass org/jetbrains/kotlin/types/expressions/typeInfoFactory/TypeInfoFactoryKt +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/NewAbstractResolvedCall$getDataFlowInfoForArguments$1 +instanceKlass org/jetbrains/kotlin/resolve/calls/results/SingleOverloadResolutionResult$WhenMappings +instanceKlass org/jetbrains/kotlin/resolve/calls/results/AbstractOverloadResolutionResults +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/CallInfo +instanceKlass org/jetbrains/kotlin/resolve/calls/components/CompletedCallInfo +instanceKlass org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy +instanceKlass org/jetbrains/kotlin/resolve/calls/model/DiagnosticReporter +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidateKt +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/TrackingBindingTrace +instanceKlass org/jetbrains/kotlin/load/kotlin/ModuleNameKt +instanceKlass org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment$JsContainerSource +instanceKlass org/jetbrains/kotlin/js/resolve/ModuleAnnotationsKt +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformerKt$WhenMappings +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformerKt +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ArgumentMappingKt +instanceKlass org/jetbrains/kotlin/resolve/sam/SamConstructorDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/synthetic/FunctionInterfaceConstructorDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/synthetic/SyntheticMemberDescriptor +instanceKlass org/jetbrains/kotlin/resolve/checkers/MissingDependencySupertypeChecker +instanceKlass org/jetbrains/kotlin/contracts/parsing/ContractsDslNames +instanceKlass org/jetbrains/kotlin/contracts/parsing/PsiContractsUtilsKt +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ExpressionValueArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/resolvedCallUtil/ResolvedCallUtilKt$WhenMappings +instanceKlass org/jetbrains/kotlin/resolve/calls/resolvedCallUtil/ResolvedCallUtilKt +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/ConstructorHeaderCallCheckerKt +instanceKlass org/jetbrains/kotlin/resolve/calls/tasks/DynamicCallsKt +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/CallCheckerKt +instanceKlass org/jetbrains/kotlin/resolve/inline/InlineUtil +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/NewVariableAsFunctionResolvedCallImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/model/VariableAsFunctionResolvedCall +instanceKlass org/jetbrains/kotlin/types/AbstractTypeApproximator$WhenMappings +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemContextKt$WhenMappings +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemContextKt +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/PSIKotlinCallsKt +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/ResolvedAtomCompleter +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/InferenceUtilsKt +instanceKlass org/jetbrains/kotlin/load/java/structure/ListBasedJavaAnnotationOwner$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/MutableVariableWithConstraints$WhenMappings +instanceKlass kotlin/collections/MapWithDefault +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder$WhenMappings +instanceKlass org/jetbrains/kotlin/resolve/calls/model/LambdaWithTypeVariableAsExpectedTypeMarker +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ResolutionAtomsKt +instanceKlass org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter$WhenMappings +instanceKlass org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleterKt +instanceKlass org/jetbrains/kotlin/resolve/calls/components/CompletionModeCalculator$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/components/CompletionModeCalculator +instanceKlass org/jetbrains/kotlin/resolve/KtDescriptorUtilKt +instanceKlass org/jetbrains/kotlin/resolve/RecursiveContractHelperKt +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/CandidateApplicabilityKt +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/KnownResultProcessor +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/ImplicitScopeTowerKt +instanceKlass org/jetbrains/kotlin/resolve/calls/components/CheckExplicitReceiverKindConsistency$WhenMappings +instanceKlass org/jetbrains/kotlin/types/AbstractTypeCheckerContext$SupertypesPolicy +instanceKlass org/jetbrains/kotlin/types/checker/NewCapturedTypeKt +instanceKlass org/jetbrains/kotlin/descriptors/ModalityUtilsKt +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector$TypeCheckerContext$$Lambda$275 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintIncorporator$Context$DefaultImpls +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemContextHelpersKt +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/NewTypeSubstitutorKt$createCompositeSubstitutor$1 +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/NewTypeSubstitutorKt +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/NewTypeSubstitutorByConstructorMap +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinderKt +instanceKlass org/jetbrains/kotlin/types/model/MarkerExtensionsKt +instanceKlass org/jetbrains/kotlin/types/ErrorUtils$UninferredParameterTypeConstructor +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintContext +instanceKlass org/jetbrains/kotlin/resolve/descriptorUtil/AnnotationsForResolveKt +instanceKlass org/jetbrains/kotlin/resolve/descriptorUtil/AnnotationsForResolveUtilsKt +instanceKlass org/jetbrains/kotlin/types/checker/ClassicTypeSystemContextKt +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemCommonSuperTypesContext$DefaultImpls +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemInferenceExtensionContextDelegate$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/InitialConstraint +instanceKlass org/jetbrains/kotlin/types/checker/NewCapturedTypeConstructor +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/NewTypeSubstitutor$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/MutableVariableWithConstraints +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/FreshVariableNewTypeSubstitutor$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/FreshVariableNewTypeSubstitutor +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/TypeVariableKt +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/TypeVariableTypeConstructor +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/NewTypeVariable +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/TowerUtilsKt +instanceKlass org/jetbrains/kotlin/resolve/deprecation/DeprecationKt$DEPRECATED_FUNCTION_KEY$1 +instanceKlass org/jetbrains/kotlin/resolve/deprecation/DeprecationKt +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/OperatorCallCheckerKt +instanceKlass org/jetbrains/kotlin/resolve/SinceKotlinAccessibility +instanceKlass org/jetbrains/kotlin/resolve/calls/util/FakeCallableDescriptorForObject +instanceKlass org/jetbrains/kotlin/resolve/SinceKotlinUtilKt +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInferenceKt +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintStorage$Empty +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/DescriptorRelatedInferenceUtilsKt +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/MutableConstraintStorage +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintStorage +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/NewConstraintSystem +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ClassicTypeSystemContextForCSKt +instanceKlass org/jetbrains/kotlin/resolve/calls/model/KotlinCallKt$WhenMappings +instanceKlass org/jetbrains/kotlin/resolve/calls/model/KotlinCallKt +instanceKlass org/jetbrains/kotlin/resolve/calls/model/GivenCandidate +instanceKlass org/jetbrains/kotlin/psi/KtPsiFactoryKt +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver$ASTScopeTower +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/PSIKotlinCall +instanceKlass org/jetbrains/kotlin/resolve/calls/callUtil/CallUtilKt +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ResolutionPart +instanceKlass org/jetbrains/kotlin/resolve/calls/GenericCandidateResolverKt +instanceKlass org/jetbrains/kotlin/resolve/calls/CallResolver$ResolutionTask +instanceKlass org/jetbrains/kotlin/resolve/calls/CallResolver$$Lambda$274 +instanceKlass org/jetbrains/kotlin/resolve/calls/tasks/AbstractTracingStrategy +instanceKlass org/jetbrains/kotlin/resolve/scopes/SyntheticScopesKt +instanceKlass org/jetbrains/kotlin/resolve/calls/callResolverUtil/CallResolverUtilKt +instanceKlass org/jetbrains/kotlin/resolve/calls/context/ResolutionResultsCacheImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/context/ResolutionContext$$Lambda$273 +instanceKlass org/jetbrains/kotlin/resolve/calls/context/ResolutionResultsCache +instanceKlass org/jetbrains/kotlin/resolve/calls/util/CallMaker$3 +instanceKlass org/jetbrains/kotlin/resolve/calls/util/DelegatingCall +instanceKlass org/jetbrains/kotlin/resolve/calls/util/CallMaker +instanceKlass org/jetbrains/kotlin/resolve/FunctionDescriptorUtil$$Lambda$272 +instanceKlass org/jetbrains/kotlin/resolve/FunctionDescriptorUtil +instanceKlass org/jetbrains/kotlin/resolve/MemberComparator$NameAndTypeMemberComparator +instanceKlass org/jetbrains/kotlin/load/java/AnnotationTypeQualifierResolverKt +instanceKlass org/jetbrains/kotlin/descriptors/annotations/AnnotationDescriptor$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/constants/ConstantValueFactory +instanceKlass org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$loadAnnotation$1$visitArray$1 +instanceKlass org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$loadAnnotation$1 +instanceKlass org/jetbrains/kotlin/SpecialJvmAnnotations +instanceKlass org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadClassAnnotations$1 +instanceKlass org/jetbrains/kotlin/load/java/components/JavaAnnotationDescriptor +instanceKlass org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData$$Lambda$271 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/resolve/jvm/jvmSignature/KotlinToJvmSignatureMapperKt +instanceKlass org/jetbrains/kotlin/resolve/jvm/InlineClassManglingRulesKt +instanceKlass org/jetbrains/kotlin/resolve/jvm/jvmSignature/JvmMethodSignature +instanceKlass org/jetbrains/org/objectweb/asm/commons/Method +instanceKlass org/jetbrains/kotlin/codegen/state/InlineClassManglingUtilsKt +instanceKlass org/jetbrains/kotlin/descriptors/ScriptDescriptor +instanceKlass org/jetbrains/kotlin/load/java/SpecialBuiltinMembers +instanceKlass org/jetbrains/kotlin/codegen/AccessorForCallableDescriptor +instanceKlass org/jetbrains/kotlin/codegen/state/KotlinTypeMapper$WhenMappings +instanceKlass org/jetbrains/kotlin/codegen/signature/AsmTypeFactory +instanceKlass org/jetbrains/kotlin/load/kotlin/JvmDescriptorTypeWriter +instanceKlass org/jetbrains/kotlin/codegen/JvmCodegenUtil +instanceKlass org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegenUtilKt$INITIAL_SUSPEND_DESCRIPTOR_FOR_DO_RESUME$1 +instanceKlass org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegenUtilKt$INITIAL_DESCRIPTOR_FOR_SUSPEND_FUNCTION$1 +instanceKlass org/jetbrains/kotlin/codegen/CodegenUtilKt +instanceKlass org/jetbrains/kotlin/config/CoroutineLanguageVersionSettingsUtilKt +instanceKlass org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegenUtilKt +instanceKlass org/jetbrains/kotlin/codegen/OwnerKind$Companion +instanceKlass kotlinx/android/parcel/Parceler +instanceKlass kotlinx/parcelize/Parceler +instanceKlass kotlinx/android/parcel/RawValue +instanceKlass kotlinx/parcelize/RawValue +instanceKlass kotlinx/android/parcel/Parcelize +instanceKlass kotlinx/parcelize/Parcelize +instanceKlass kotlinx/android/parcel/WriteWith +instanceKlass kotlinx/parcelize/WriteWith +instanceKlass kotlinx/android/parcel/TypeParceler +instanceKlass kotlinx/parcelize/TypeParceler +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeResolveExtensionKt +instanceKlass org/jetbrains/kotlin/resolve/OverridingUtil$3 +instanceKlass org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl$CopyConfiguration +instanceKlass org/jetbrains/kotlin/load/java/lazy/descriptors/JavaDescriptorUtilKt +instanceKlass org/jetbrains/kotlin/load/java/components/DescriptorResolverUtils$1$1 +instanceKlass org/jetbrains/kotlin/resolve/scopes/DescriptorKindExclude +instanceKlass org/jetbrains/kotlin/resolve/OverridingUtil$4 +instanceKlass org/jetbrains/kotlin/resolve/OverridingUtil$5 +instanceKlass org/jetbrains/kotlin/descriptors/Visibilities +instanceKlass org/jetbrains/kotlin/utils/SmartSet$SingletonIterator +instanceKlass org/jetbrains/kotlin/resolve/OverridingUtil$8 +instanceKlass org/jetbrains/kotlin/resolve/OverridingUtil$OverrideCompatibilityInfo +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/AbstractReceiverValue +instanceKlass org/jetbrains/kotlin/types/typesApproximation/CapturedTypeApproximationKt +instanceKlass org/jetbrains/kotlin/types/NotNullTypeVariable +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/PredefinedFunctionEnhancementInfo +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/TypeEnhancementInfo +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/SignatureEnhancementBuilder$ClassEnhancementBuilder$FunctionEnhancementBuilder +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/SignatureEnhancementBuilder$ClassEnhancementBuilder +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/SignatureEnhancementBuilder +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/PredefinedEnhancementInfoKt +instanceKlass org/jetbrains/kotlin/load/kotlin/MethodSignatureBuildingUtilsKt +instanceKlass org/jetbrains/kotlin/load/java/components/DescriptorResolverUtils +instanceKlass org/jetbrains/kotlin/load/kotlin/JvmTypeFactoryImpl$WhenMappings +instanceKlass org/jetbrains/kotlin/load/kotlin/JvmType$Companion +instanceKlass org/jetbrains/kotlin/load/kotlin/JvmType +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemInferenceExtensionContext$DefaultImpls +instanceKlass org/jetbrains/kotlin/load/kotlin/TypeSignatureMappingKt +instanceKlass org/jetbrains/kotlin/load/kotlin/TypeMappingConfiguration$DefaultImpls +instanceKlass org/jetbrains/kotlin/utils/FunctionsKt +instanceKlass org/jetbrains/kotlin/load/kotlin/DescriptorBasedTypeSignatureMappingKt +instanceKlass org/jetbrains/kotlin/load/kotlin/TypeMappingConfigurationImpl +instanceKlass org/jetbrains/kotlin/load/kotlin/TypeMappingMode$Companion +instanceKlass org/jetbrains/kotlin/load/kotlin/TypeMappingMode +instanceKlass org/jetbrains/kotlin/load/kotlin/JvmTypeFactoryImpl +instanceKlass org/jetbrains/kotlin/load/kotlin/JvmTypeFactory +instanceKlass org/jetbrains/kotlin/load/kotlin/MethodSignatureMappingKt +instanceKlass org/jetbrains/kotlin/descriptors/deserialization/AdditionalClassPartsProvider$None +instanceKlass org/jetbrains/kotlin/descriptors/deserialization/PlatformDependentDeclarationFilter$NoPlatformDependent +instanceKlass org/jetbrains/kotlin/builtins/DefaultBuiltIns$Companion +instanceKlass org/jetbrains/kotlin/builtins/SuspendFunctionTypesKt +instanceKlass org/jetbrains/kotlin/load/java/SpecialGenericSignatures$Companion$NameAndSignature +instanceKlass org/jetbrains/kotlin/load/java/SpecialGenericSignatures$Companion +instanceKlass org/jetbrains/kotlin/load/java/SpecialGenericSignatures +instanceKlass org/jetbrains/kotlin/load/java/BuiltinSpecialPropertiesKt +instanceKlass org/jetbrains/kotlin/load/java/BuiltinSpecialProperties +instanceKlass org/jetbrains/kotlin/load/java/JvmAbi +instanceKlass org/jetbrains/kotlin/load/java/PropertiesConventionUtilKt +instanceKlass org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope$MethodSignatureData +instanceKlass org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData$ValueParameters +instanceKlass org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData$$Lambda$270 +instanceKlass org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturePropagationUtilKt +instanceKlass org/jetbrains/kotlin/util/CheckResult +instanceKlass org/jetbrains/kotlin/util/ReturnsCheck +instanceKlass org/jetbrains/kotlin/util/IsKPropertyCheck +instanceKlass org/jetbrains/kotlin/util/NoDefaultAndVarargsCheck +instanceKlass org/jetbrains/kotlin/util/ValueParameterCountCheck +instanceKlass org/jetbrains/kotlin/util/MemberKindCheck +instanceKlass org/jetbrains/kotlin/util/Check +instanceKlass org/jetbrains/kotlin/util/Checks +instanceKlass org/jetbrains/kotlin/util/AbstractModifierChecks +instanceKlass org/jetbrains/kotlin/codegen/state/KotlinTypeMapper$typeMappingConfiguration$1 +instanceKlass org/jetbrains/kotlin/codegen/ClassBuilderMode +instanceKlass org/jetbrains/kotlin/resolve/InlineClassDescriptorResolver +instanceKlass org/jetbrains/kotlin/codegen/state/KotlinTypeMapper$Companion$staticTypeMappingConfiguration$1 +instanceKlass org/jetbrains/kotlin/load/kotlin/TypeMappingConfiguration +instanceKlass org/jetbrains/kotlin/codegen/state/KotlinTypeMapper$Companion +instanceKlass org/jetbrains/kotlin/codegen/state/KotlinTypeMapperBase +instanceKlass org/jetbrains/kotlin/codegen/signature/KotlinToJvmSignatureMapperImpl +instanceKlass org/jetbrains/kotlin/resolve/jvm/jvmSignature/KotlinToJvmSignatureMapper +instanceKlass org/jetbrains/kotlin/resolve/jvm/kotlinSignature/SignaturesPropagationData +instanceKlass org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor$1 +instanceKlass org/jetbrains/kotlin/descriptors/CallableDescriptor$UserDataKey +instanceKlass org/jetbrains/kotlin/resolve/BindingContextUtils +instanceKlass org/jetbrains/kotlin/psi/KtNamedFunction$$Lambda$269 +instanceKlass org/jetbrains/kotlin/resolve/calls/util/UnderscoreUtilKt +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaLoadingKt +instanceKlass org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage$IntList +instanceKlass org/jetbrains/kotlin/resolve/scopes/utils/LexicalScopeWrapper +instanceKlass org/jetbrains/kotlin/types/expressions/ExpressionTypingUtils +instanceKlass org/jetbrains/kotlin/resolve/constants/IntegerLiteralTypeConstructor +instanceKlass org/jetbrains/kotlin/types/AbstractNullabilityChecker +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemContext$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/constants/IntegerValueTypeConstructor +instanceKlass org/jetbrains/kotlin/types/AbstractTypeChecker +instanceKlass org/jetbrains/kotlin/types/checker/ClassicTypeCheckerContext$Companion +instanceKlass org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm$1 +instanceKlass org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm +instanceKlass org/jetbrains/kotlin/resolve/scopes/LexicalWritableScope$Snapshot +instanceKlass org/jetbrains/kotlin/resolve/scopes/AbstractLocalRedeclarationChecker +instanceKlass org/jetbrains/kotlin/resolve/TypeResolver$Companion$WhenMappings +instanceKlass kotlin/sequences/DropSequence$iterator$1 +instanceKlass kotlin/sequences/TakeWhileSequence$iterator$1 +instanceKlass kotlin/sequences/TakeWhileSequence +instanceKlass kotlin/sequences/DropSequence +instanceKlass org/jetbrains/kotlin/resolve/AnnotationChecker$Companion$TargetList +instanceKlass org/jetbrains/kotlin/resolve/AnnotationChecker$Companion$TargetLists$TargetListBuilder +instanceKlass org/jetbrains/kotlin/resolve/AnnotationChecker$Companion$TargetLists +instanceKlass org/jetbrains/kotlin/resolve/ModifiersCheckerKt$or$1 +instanceKlass org/jetbrains/kotlin/resolve/ModifiersCheckerKt$ifSupported$1 +instanceKlass org/jetbrains/kotlin/resolve/ModifiersCheckerKt$always$1 +instanceKlass org/jetbrains/kotlin/resolve/TargetAllowedPredicate +instanceKlass org/jetbrains/kotlin/resolve/ModifiersCheckerKt +instanceKlass org/jetbrains/kotlin/resolve/ModifierCheckerCore +instanceKlass org/jetbrains/kotlin/psi/KtSuperTypeListEntry$$Lambda$268 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$267 +instanceKlass org/jetbrains/kotlin/resolve/lazy/ResolveSession$$Lambda$266 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiExpressionList +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl$TypeEvaluator +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/java/PsiMethodCallExpressionImpl$TypeEvaluator +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiMethodCallExpression +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiCallExpression +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiCall +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/ExpressionParser$1 +instanceKlass org/jetbrains/kotlin/types/TypeSubstitutor$2 +instanceKlass org/jetbrains/kotlin/types/TypeSubstitutionKt +instanceKlass org/jetbrains/kotlin/types/SpecialTypesKt +instanceKlass org/jetbrains/kotlin/types/TypeCapabilitiesKt +instanceKlass org/jetbrains/kotlin/types/DynamicTypesKt +instanceKlass org/jetbrains/kotlin/types/DisjointKeysUnionTypeSubstitution$Companion +instanceKlass org/jetbrains/kotlin/types/DescriptorSubstitutor +instanceKlass org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl$CopyConfiguration +instanceKlass org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptorImpl$Companion +instanceKlass org/jetbrains/kotlin/load/java/descriptors/ValueParameterData +instanceKlass org/jetbrains/kotlin/types/FlexibleTypesKt +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/TypeEnhancementKt$WhenMappings +instanceKlass org/jetbrains/kotlin/types/checker/NewTypeVariableConstructor +instanceKlass org/jetbrains/kotlin/load/java/AnnotationQualifiersFqNamesKt +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaAnnotation$DefaultImpls +instanceKlass org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaAnnotationDescriptor +instanceKlass org/jetbrains/kotlin/load/java/descriptors/PossiblyExternalAnnotationDescriptor +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/SignatureEnhancementKt +instanceKlass org/jetbrains/kotlin/types/TypeWithEnhancement +instanceKlass org/jetbrains/kotlin/types/TypeWithEnhancementKt +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/EnhancementResult +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/EnhancedTypeAnnotations +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/TypeEnhancementKt +instanceKlass org/jetbrains/kotlin/types/RawType +instanceKlass org/jetbrains/kotlin/utils/SmartList$SingletonIteratorBase +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/SignatureEnhancement$PartEnhancementResult +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/JavaTypeEnhancement$Result +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/TypeComponentPositionKt +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/TypeEnchancementUtilsKt +instanceKlass org/jetbrains/kotlin/load/java/JvmAnnotationNamesKt +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/JavaTypeQualifiers$Companion +instanceKlass org/jetbrains/kotlin/descriptors/annotations/AnnotationsKt +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/JavaTypeQualifiers +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/TypeAndDefaultQualifiers +instanceKlass org/jetbrains/kotlin/com/intellij/util/IdempotenceChecker$$Lambda$265 +instanceKlass org/jetbrains/kotlin/com/intellij/util/IdempotenceChecker$$Lambda$264 +instanceKlass org/jetbrains/kotlin/com/intellij/util/IdempotenceChecker +instanceKlass org/jetbrains/kotlin/name/FqNamesUtilKt$WhenMappings +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/roots/ProjectRootModificationTracker +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiCachedValue$$Lambda$263 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiCachedValue$$Lambda$262 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/CachedValueProfiler +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/BaseActionRunnable +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/ReadActionProcessor$$Lambda$261 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/ReadActionProcessor +instanceKlass org/jetbrains/kotlin/com/intellij/util/CollectionQuery +instanceKlass org/jetbrains/kotlin/com/intellij/util/CommonProcessors$CollectProcessor +instanceKlass org/jetbrains/kotlin/com/intellij/util/Processors +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/file/PsiPackageImpl$$Lambda$260 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/RecursionManager$StackFrame +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/RecursionManager$MyKey +instanceKlass org/jetbrains/kotlin/com/intellij/util/CachedValueBase$$Lambda$259 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/file/PsiPackageImpl$PackageAnnotationValueProvider +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/SignatureEnhancement$SignatureParts +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructorImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructor +instanceKlass org/jetbrains/kotlin/types/FlexibleTypeImpl$Companion +instanceKlass org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope$ResolvedValueParameters +instanceKlass org/jetbrains/kotlin/load/java/descriptors/JavaCallableMemberDescriptor +instanceKlass org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext$DefaultImpls +instanceKlass org/jetbrains/kotlin/types/checker/SimpleClassicTypeSystemContext +instanceKlass org/jetbrains/kotlin/types/AbstractStrictEqualityTypeChecker +instanceKlass org/jetbrains/kotlin/types/checker/StrictEqualityTypeChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/CapturedTypeConstructorKt +instanceKlass org/jetbrains/kotlin/resolve/scopes/SubstitutingScope +instanceKlass org/jetbrains/kotlin/descriptors/impl/ModuleAwareClassDescriptorKt +instanceKlass org/jetbrains/kotlin/descriptors/impl/AbstractTypeParameterDescriptor$2$1 +instanceKlass org/jetbrains/kotlin/types/TypeProjectionBase +instanceKlass org/jetbrains/kotlin/descriptors/impl/AbstractTypeAliasDescriptor$typeConstructor$1 +instanceKlass org/jetbrains/kotlin/descriptors/annotations/AnnotationsImpl +instanceKlass org/jetbrains/kotlin/descriptors/annotations/AnnotationDescriptorImpl +instanceKlass org/jetbrains/kotlin/serialization/deserialization/AnnotationDeserializer$WhenMappings +instanceKlass org/jetbrains/kotlin/builtins/FunctionTypesKt +instanceKlass org/jetbrains/kotlin/serialization/deserialization/SuspendFunctionTypeUtilKt +instanceKlass org/jetbrains/kotlin/metadata/deserialization/VersionRequirement$Companion +instanceKlass org/jetbrains/kotlin/metadata/deserialization/VersionRequirement +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor$DefaultImpls +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedCallableMemberDescriptor$DefaultImpls +instanceKlass org/jetbrains/kotlin/descriptors/impl/ValueParameterDescriptorImpl$Companion +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedCallableMemberDescriptor +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinJvmBinarySourceElement +instanceKlass org/jetbrains/kotlin/resolve/ResolutionAnchorProviderKt +instanceKlass org/jetbrains/kotlin/descriptors/FindClassInModuleKt +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DescriptorWithContainerSource +instanceKlass org/jetbrains/kotlin/load/kotlin/ModuleVisibilityUtilsKt +instanceKlass org/jetbrains/kotlin/resolve/ImportedFromObjectCallableDescriptor +instanceKlass org/jetbrains/kotlin/resolve/ImportedFromObjectKt +instanceKlass org/jetbrains/kotlin/types/TypeConstructorSubstitution$Companion +instanceKlass org/jetbrains/kotlin/types/TypeSubstitution$Companion +instanceKlass org/jetbrains/kotlin/types/TypeSubstitution +instanceKlass org/jetbrains/kotlin/types/IntersectionTypeConstructor +instanceKlass org/jetbrains/kotlin/types/model/IntersectionTypeConstructorMarker +instanceKlass org/jetbrains/kotlin/types/CustomTypeVariable +instanceKlass org/jetbrains/kotlin/utils/SmartSet$Companion +instanceKlass org/jetbrains/kotlin/types/typeUtil/TypeUtilsKt +instanceKlass kotlin/collections/AbstractList$IteratorImpl +instanceKlass kotlin/collections/AbstractList$Companion +instanceKlass kotlin/collections/AbstractCollection +instanceKlass org/jetbrains/kotlin/resolve/checkers/TrailingCommaChecker +instanceKlass org/jetbrains/kotlin/psi/psiUtil/ReservedCheckingKt +instanceKlass org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/impl/DescriptorDerivedFromTypeAlias +instanceKlass org/jetbrains/kotlin/descriptors/DescriptorWithDeprecation$Companion +instanceKlass org/jetbrains/kotlin/descriptors/DescriptorWithDeprecation +instanceKlass org/jetbrains/kotlin/com/google/common/collect/ObjectArrays +instanceKlass org/jetbrains/kotlin/com/google/common/collect/ImmutableMultimap$Builder +instanceKlass org/jetbrains/kotlin/resolve/scopes/ImportingScope$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeFactory$currentPackageScope$1 +instanceKlass org/jetbrains/kotlin/resolve/lazy/LazyImportScope +instanceKlass org/jetbrains/kotlin/resolve/DelegatingBindingTrace$MyBindingContext +instanceKlass org/jetbrains/kotlin/resolve/AnalyzingUtils +instanceKlass org/jetbrains/kotlin/resolve/extensions/ExtraImportsProviderExtension$Companion$CompoundExtraImportsProviderExtension +instanceKlass org/jetbrains/kotlin/resolve/scopes/MemberScope$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/scopes/HierarchicalScope$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/scopes/LexicalScope$DefaultImpls +instanceKlass org/jetbrains/kotlin/psi/KtTypeElement$$Lambda$258 +instanceKlass kotlin/sequences/DropWhileSequence$iterator$1 +instanceKlass kotlin/sequences/DropWhileSequence +instanceKlass org/jetbrains/kotlin/psi/typeRefHelpers/TypeRefHelpersKt +instanceKlass org/jetbrains/kotlin/resolve/scopes/ScopeUtils +instanceKlass org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter$LazySplitAnnotations +instanceKlass org/jetbrains/kotlin/descriptors/annotations/CompositeAnnotations +instanceKlass org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter$Companion +instanceKlass org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/project/ProjectCoreUtil +instanceKlass org/jetbrains/kotlin/psi/KtProperty$$Lambda$257 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/ThrowableComputable +instanceKlass org/jetbrains/kotlin/resolve/VariableAsPropertyInfo$Companion +instanceKlass org/jetbrains/kotlin/resolve/VariableAsPropertyInfo +instanceKlass org/jetbrains/kotlin/resolve/calls/components/InferenceSession$Companion$default$1 +instanceKlass org/jetbrains/kotlin/resolve/calls/components/InferenceSession$Companion +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/ClassResolutionScopesSupportKt +instanceKlass org/jetbrains/kotlin/util/Box +instanceKlass org/jetbrains/kotlin/types/DeferredType$$Lambda$256 +instanceKlass org/jetbrains/kotlin/resolve/DescriptorFactory +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/ImplicitClassReceiver +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/ThisClassReceiver +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/ImplicitReceiver +instanceKlass org/jetbrains/kotlin/resolve/scopes/LexicalChainedScope$Companion +instanceKlass org/jetbrains/kotlin/resolve/scopes/LexicalChainedScope +instanceKlass org/jetbrains/kotlin/resolve/OverridingStrategy +instanceKlass org/jetbrains/kotlin/resolve/InlineClassesUtilsKt +instanceKlass org/jetbrains/kotlin/resolve/DelegationResolver$Companion +instanceKlass org/jetbrains/kotlin/resolve/DelegationResolver +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope$generateDelegatingDescriptors$lazyMemberExtractor$1 +instanceKlass org/jetbrains/kotlin/resolve/DelegationResolver$MemberExtractor +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope$generateDelegatingDescriptors$lazyTypeResolver$1 +instanceKlass org/jetbrains/kotlin/resolve/DelegationResolver$TypeResolver +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/ClassMemberDeclarationProvider$DefaultImpls +instanceKlass org/jetbrains/kotlin/types/KotlinTypeKt +instanceKlass org/jetbrains/kotlin/descriptors/annotations/Annotations$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/jvm/annotations/JvmAnnotationUtilKt +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Lists +instanceKlass org/jetbrains/kotlin/resolve/scopes/LexicalScopeImpl$InitializeHandler +instanceKlass org/jetbrains/kotlin/resolve/scopes/LocalRedeclarationChecker$DO_NOTHING +instanceKlass org/jetbrains/kotlin/psi/KtDeclaration$$Lambda$255 +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/ClassValueReceiver +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope$Companion$EXTRACT_PROPERTIES$1 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope$Companion$EXTRACT_FUNCTIONS$1 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope$MemberExtractor +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope$Companion +instanceKlass kotlin/sequences/SequencesKt___SequencesKt$asIterable$$inlined$Iterable$1 +instanceKlass org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaStaticClassScope$flatMapJavaStaticSupertypesScopes$1 +instanceKlass org/jetbrains/kotlin/load/kotlin/SignatureBuildingComponents +instanceKlass org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsSignatures +instanceKlass org/jetbrains/kotlin/metadata/deserialization/ProtoTypeTableUtilKt +instanceKlass org/jetbrains/kotlin/descriptors/ModuleDescriptor$DefaultImpls +instanceKlass org/jetbrains/kotlin/utils/DFS +instanceKlass org/jetbrains/kotlin/utils/DFS$AbstractNodeHandler +instanceKlass org/jetbrains/kotlin/utils/DFS$NodeHandler +instanceKlass org/jetbrains/kotlin/utils/DFS$VisitedWithSet +instanceKlass org/jetbrains/kotlin/utils/DFS$Visited +instanceKlass org/jetbrains/kotlin/resolve/FindLoopsInSupertypes +instanceKlass org/jetbrains/kotlin/resolve/SupertypeLoopCheckerImpl$$Lambda$254 +instanceKlass org/jetbrains/kotlin/utils/DFS$Neighbors +instanceKlass org/jetbrains/kotlin/storage/SingleThreadValue +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$TypeAliasOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Effect$InvocationKind$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Expression$ConstantValue$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$ExpressionOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Effect$EffectType$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$EffectOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$VersionRequirement$VersionKind$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$VersionRequirement$Level$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$VersionRequirementOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/JvmNameResolver$WhenMappings +instanceKlass org/jetbrains/kotlin/metadata/deserialization/ProtoBufUtilKt +instanceKlass org/jetbrains/kotlin/load/kotlin/JvmPackagePartSource +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedContainerSource +instanceKlass org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf$StringTableTypes$Record$Operation$1 +instanceKlass org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf$StringTableTypes$RecordOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf$StringTableTypesOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/JvmNameResolver$Companion +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/JvmNameResolver +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/UtfEncodingKt +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/BitEncoding +instanceKlass org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader +instanceKlass org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor$CollectStringArrayAnnotationVisitor +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass$AnnotationArrayArgumentVisitor +instanceKlass org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor$KotlinMetadataArgumentVisitor +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinClassFinderKt +instanceKlass org/jetbrains/kotlin/descriptors/DescriptorUtilKt +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/ClassifierResolutionContext$Result +instanceKlass org/jetbrains/kotlin/load/java/lazy/types/JavaTypeAttributes +instanceKlass org/jetbrains/kotlin/load/java/lazy/types/JavaTypeResolverKt +instanceKlass org/jetbrains/kotlin/load/java/FakePureImplementationsProvider +instanceKlass org/jetbrains/kotlin/load/java/components/JavaAnnotationMapper +instanceKlass org/jetbrains/kotlin/load/java/structure/MapBasedJavaAnnotationOwner$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/jvm/JvmClassName +instanceKlass org/jetbrains/kotlin/load/java/JvmAnnotationNames +instanceKlass org/jetbrains/kotlin/types/AbstractTypeConstructor$Supertypes +instanceKlass org/jetbrains/kotlin/load/java/descriptors/UtilKt +instanceKlass org/jetbrains/kotlin/load/java/lazy/descriptors/ClassDeclaredMemberIndex +instanceKlass org/jetbrains/kotlin/load/java/lazy/descriptors/DeclaredMemberIndex +instanceKlass org/jetbrains/kotlin/resolve/descriptorUtil/DescriptorUtilsKt$WhenMappings +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/ClassQualifier +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/ClassifierQualifier +instanceKlass org/jetbrains/kotlin/resolve/AllUnderImportScope$Companion +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaEnumValueAnnotationArgument +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$253 +instanceKlass org/jetbrains/kotlin/com/google/common/collect/AbstractMapBasedMultimap$KeySet$1 +instanceKlass org/jetbrains/kotlin/com/google/common/collect/PeekingIterator +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Iterators +instanceKlass org/jetbrains/kotlin/com/google/common/collect/AbstractMapBasedMultimap$Itr +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$252 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$251 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$250 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$249 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/ClassResolutionScopesSupport$Companion +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/ClassResolutionScopesSupport +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$248 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$247 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$246 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$245 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$LazyClassTypeConstructor$$Lambda$244 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$243 +instanceKlass org/jetbrains/kotlin/resolve/source/KotlinSourceElementKt +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor$$Lambda$242 +instanceKlass org/jetbrains/kotlin/resolve/lazy/data/KtClassOrObjectInfo +instanceKlass org/jetbrains/kotlin/resolve/lazy/data/KtClassInfoUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/PsiElementProcessor$CollectElements +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/PsiElementProcessor$FindElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/PsiElementProcessor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/PsiTreeUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiClassLevelDeclarationStatement +instanceKlass java/util/ComparableTimSort +instanceKlass org/jetbrains/kotlin/com/intellij/psi/augment/PsiAugmentProvider$$Lambda$241 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiModifierListImpl$ModifierCache +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/JavaElementUtil +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/JavaElementCollectionFromPsiArrayUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiTypeParameter$$Lambda$240 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiImplUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/RecursiveTreeElementWalkingVisitor$ASTTreeGuide +instanceKlass org/jetbrains/kotlin/com/intellij/util/WalkingState +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaSourceUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/ChildRole +instanceKlass org/jetbrains/kotlin/asJava/KtLightClassMarker +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl$Companion +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/ClassInnerStuffCache +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiExtensibleClass +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/javadoc/PsiDocCommentImpl$$Lambda$239 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/javadoc/PsiDocTag +instanceKlass org/jetbrains/kotlin/com/intellij/psi/javadoc/PsiDocComment +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiDocCommentBase +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiCodeBlock +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiTypeElement$$Lambda$238 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/ClassReferencePointer +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/types/JvmArrayType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiReferenceParameterList +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiReference$$Lambda$237 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/ResolveCache$PolyVariantContextResolver +instanceKlass org/jetbrains/kotlin/com/intellij/psi/filters/ElementFilter +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/SourceJavaCodeReference +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiAnnotatedJavaCodeReferenceElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiPackageStatement +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/ReferenceParser$TypeInfo +instanceKlass org/jetbrains/kotlin/com/intellij/lang/PsiBuilderUtil +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/FileParser$$Lambda$236 +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/ReferenceParser +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/ExpressionParser +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/StatementParser +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/DeclarationParser +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/ModuleParser +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/FileParser +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/JavaParser +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/FileContextUtil +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/lexer/_JavaLexer +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/PsiUtil$$Lambda$235 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/JavaResolveResult +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/types/JvmWildcardType +instanceKlass org/jetbrains/kotlin/com/intellij/util/indexing/IndexingDataKeys +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/JavaParserUtil$TrailingWhitespacesAndCommentsBinder +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/JavaParserUtil$PrecedingWhitespacesAndCommentsBinder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaDocElementType$3$$Lambda$234 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaDocElementType$2$$Lambda$233 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaDocElementType$1$$Lambda$232 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaDocElementType$$Lambda$231 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaDocElementType$$Lambda$230 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaDocElementType$$Lambda$229 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaDocElementType$$Lambda$228 +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/JavaParserUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiClass$$Lambda$227 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$TypeTextElementType$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$4$$Lambda$226 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$3$$Lambda$225 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$2$$Lambda$224 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$1$$Lambda$223 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$222 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$221 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$220 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$219 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$218 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$217 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$216 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$215 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$214 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$213 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$212 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$211 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$210 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$209 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$208 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$207 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$206 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$205 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$204 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$203 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$202 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$201 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$200 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$199 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$198 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$197 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$196 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$195 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$194 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$193 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$192 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$191 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$190 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$189 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$188 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$187 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$186 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$185 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$184 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$183 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$182 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$181 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$180 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$179 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$178 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$177 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$176 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$175 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$174 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$173 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$172 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$171 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$170 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$169 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$168 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$167 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$166 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType$$Lambda$165 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiImportStatementStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiReferenceList +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiClassReferenceListStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiFieldStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiMethodStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiClassStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiPackageAccessibilityStatement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiPackageAccessibilityStatementStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiRecordHeader +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiRecordHeaderStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiRecordComponent +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiRecordComponentStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiMemberStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiProvidesStatement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiProvidesStatementStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiUsesStatement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiUsesStatementStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiRequiresStatement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiStatement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiRequiresStatementStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiJavaModule +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiJavaModuleStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiImportList +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiImportListStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiClassInitializer +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiClassInitializerStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiTypeParameterList +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiTypeParameterListStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiTypeParameter +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmTypeParameter +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiTypeParameterStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiParameterStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiParameterList +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiParameterListStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiMethodReferenceExpression +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiLambdaExpression +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiFunctionalExpression +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiLiteralExpression +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiLiteral +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiLiteralValue +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiNameValuePair +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/annotation/JvmAnnotationAttribute +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiNameValuePairStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiAnnotationParameterList +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiAnnotationParameterListStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiAnnotationStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiModifierListStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/JavaStubElementTypes +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/ILightLazyParseableElementType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/Constants +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/ElementType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaElementType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/JavaDocElementType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/JavaTokenType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/JavaDocTokenType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiJavaFileBaseImpl$MyCacheBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiJavaFileBaseImpl$$Lambda$164 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/scope/PsiScopeProcessor$Event +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiJavaFile +instanceKlass java/util/RegularEnumSet$EnumSetIterator +instanceKlass org/jetbrains/kotlin/resolve/extensions/SyntheticResolveExtension$DefaultImpls +instanceKlass org/jetbrains/kotlin/com/google/common/collect/LinkedHashMultimap$ValueSet$1 +instanceKlass org/jetbrains/kotlin/com/google/common/collect/AbstractMapBasedMultimap$WrappedCollection$WrappedIterator +instanceKlass org/jetbrains/kotlin/com/google/common/collect/ListMultimap +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider$Index +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaWildcardType +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaTypeParameter +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaTypeParameter +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaArrayType +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaAnnotationAsAnnotationArgument +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaArrayAnnotationArgument +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/PlainJavaAnnotationArgument +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaLiteralAnnotationArgument +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaAnnotationArgument +instanceKlass org/jetbrains/org/objectweb/asm/FieldVisitor +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaField +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass$WhenMappings +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Sets +instanceKlass org/jetbrains/kotlin/builtins/CompanionObjectMapping +instanceKlass org/jetbrains/kotlin/name/FqNamesUtilKt +instanceKlass org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping +instanceKlass org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMap +instanceKlass org/jetbrains/kotlin/resolve/PlatformClassesMappedToKotlinChecker +instanceKlass org/jetbrains/kotlin/load/java/JavaDescriptorVisibilities +instanceKlass org/jetbrains/kotlin/load/java/UtilsKt +instanceKlass org/jetbrains/kotlin/resolve/QualifiedExpressionResolverKt +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/JavaModifierListOwnerImpl +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/JavaAnnotationOwnerImpl +instanceKlass org/jetbrains/kotlin/load/java/lazy/LazyJavaTypeParameterResolver +instanceKlass org/jetbrains/kotlin/load/java/components/JavaSourceElementImpl +instanceKlass org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor$Companion +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaAnnotation$Companion +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaAnnotation +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaAnnotation +instanceKlass org/jetbrains/org/objectweb/asm/MethodVisitor +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaConstructor +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaValueParameter +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaValueParameter +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaMethodBase$Companion$MethodInfo +instanceKlass org/jetbrains/kotlin/utils/addToStdlib/AddToStdlibKt +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaPrimitiveType +instanceKlass java/text/StringCharacterIterator +instanceKlass java/text/CharacterIterator +instanceKlass org/jetbrains/org/objectweb/asm/Type +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaMethodBase$Companion +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaMethodBase +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaModifierListOwner$DefaultImpls +instanceKlass javaslang/control/Option$Some +instanceKlass javaslang/control/Option +instanceKlass org/jetbrains/kotlin/util/javaslang/JavaslangAdaptersKt +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/ClassifierResolutionContext$InnerClassInfo +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/CommonMixinsKt +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/JavaPlainType +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaClassifierType +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaType +instanceKlass org/jetbrains/kotlin/load/java/structure/ListBasedJavaAnnotationOwner +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaModifierListOwner +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/VirtualFileBoundJavaClass +instanceKlass org/jetbrains/kotlin/load/java/structure/MutableJavaAnnotationOwner +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/ClassifierResolutionContext +instanceKlass org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass$OuterAndInnerName +instanceKlass org/jetbrains/org/objectweb/asm/Context +instanceKlass org/jetbrains/org/objectweb/asm/Attribute +instanceKlass org/jetbrains/org/objectweb/asm/Label +instanceKlass org/jetbrains/org/objectweb/asm/ClassReader +instanceKlass org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass$InnerClassesInfo +instanceKlass org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass$AnnotationVisitor +instanceKlass org/jetbrains/kotlin/load/kotlin/VirtualFileKotlinClass$Factory +instanceKlass org/jetbrains/org/objectweb/asm/AnnotationVisitor +instanceKlass org/jetbrains/org/objectweb/asm/ClassVisitor +instanceKlass org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinBinaryClassCache$Companion$$Lambda$163 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Computable +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinBinaryClassCache$RequestCache +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl$WhenMappings +instanceKlass org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult +instanceKlass org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest +instanceKlass org/jetbrains/kotlin/name/SpecialNames +instanceKlass org/jetbrains/kotlin/resolve/scopes/ResolutionScope$DefaultImpls +instanceKlass org/jetbrains/kotlin/utils/CallOnceFunction +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/QualifierKt +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/PackageQualifier +instanceKlass org/jetbrains/kotlin/util/slicedMap/OpenAddressLinearProbingHashTableKt +instanceKlass org/jetbrains/kotlin/util/slicedMap/OpenAddressLinearProbingHashTable$Companion +instanceKlass org/jetbrains/kotlin/resolve/jvm/multiplatform/OptionalAnnotationClassDataFinder +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl$SearchResult +instanceKlass org/jetbrains/kotlin/load/java/lazy/LazyJavaAnnotations +instanceKlass org/jetbrains/kotlin/load/java/lazy/LazyJavaAnnotationsKt +instanceKlass org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope +instanceKlass org/jetbrains/kotlin/load/java/lazy/ContextKt +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaElementsKt +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/JavaElementImpl +instanceKlass org/jetbrains/kotlin/load/java/structure/MapBasedJavaAnnotationOwner +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl$FindClassRequest +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl$WhenMappings +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/IntArrayList +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl$Cache +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl$TraverseRequest +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl$SearchRequest +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndex$DefaultImpls +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImplKt +instanceKlass kotlin/jvm/internal/Ref$BooleanRef +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade$$Lambda$162 +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinSafeClassFinder +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ImmutableList$Itr +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade$CliFinder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/GlobalSearchScope$UnionScope$$Lambda$161 +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade$PackageCache +instanceKlass kotlin/collections/builders/ListBuilder$Itr +instanceKlass kotlin/jvm/internal/markers/KMutableListIterator +instanceKlass org/jetbrains/kotlin/descriptors/PackageViewDescriptor$DefaultImpls +instanceKlass org/jetbrains/kotlin/utils/StringsKt +instanceKlass java/util/AbstractList$SubList$1 +instanceKlass java/util/regex/CharPredicates$$Lambda$160 +instanceKlass org/jetbrains/kotlin/psi/psiUtil/KtPsiUtilKt +instanceKlass org/jetbrains/kotlin/psi/KtImportInfo$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/source/KotlinSourceElement +instanceKlass org/jetbrains/kotlin/resolve/source/PsiSourceElement +instanceKlass org/jetbrains/kotlin/resolve/PackageFragmentWithCustomSource +instanceKlass org/jetbrains/kotlin/psi/KtCodeFragmentBase +instanceKlass org/jetbrains/kotlin/com/intellij/psi/JavaCodeFragment +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiCodeFragment +instanceKlass org/jetbrains/kotlin/psi/codeFragmentUtil/CodeFragmentUtilKt +instanceKlass org/jetbrains/kotlin/resolve/lazy/ForceResolveUtil +instanceKlass org/jetbrains/kotlin/resolve/scopes/utils/ScopeUtilsKt +instanceKlass org/jetbrains/kotlin/util/slicedMap/Slices$SliceBuilder +instanceKlass org/jetbrains/kotlin/util/slicedMap/SetSlice$Companion +instanceKlass org/jetbrains/kotlin/util/slicedMap/RewritePolicy$1 +instanceKlass org/jetbrains/kotlin/resolve/BindingContext$1 +instanceKlass org/jetbrains/kotlin/resolve/bindingContextUtil/BindingContextUtilsKt +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeFactory$FilesScopesBuilder$importResolver$1 +instanceKlass org/jetbrains/kotlin/resolve/scopes/BaseHierarchicalScope +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeFactory$FilesScopesBuilder$lazyImportingScope$1 +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeFactoryKt +instanceKlass org/jetbrains/kotlin/resolve/lazy/LazyImportResolver +instanceKlass org/jetbrains/kotlin/resolve/lazy/IndexedImports +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeFactory$FilesScopesBuilder +instanceKlass org/jetbrains/kotlin/storage/LockBasedStorageManager$KeyWithComputation +instanceKlass org/jetbrains/kotlin/resolve/lazy/ResolveSession$$Lambda$159 +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/AbstractPsiBasedDeclarationProvider +instanceKlass org/jetbrains/kotlin/parsing/KotlinParsing$4 +instanceKlass org/jetbrains/kotlin/lexer/_JetLexer$State +instanceKlass org/jetbrains/kotlin/psi/KtPsiUtil +instanceKlass org/jetbrains/kotlin/psi/KtSimpleNameExpressionImpl$Companion +instanceKlass org/jetbrains/kotlin/psi/KtExpressionImpl$Companion +instanceKlass org/jetbrains/kotlin/psi/KtNameReferenceExpression$Companion +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/SourceTreeToPsiMap +instanceKlass org/jetbrains/kotlin/psi/psiUtil/PsiUtilsKt$siblings$1$iterator$1 +instanceKlass kotlin/jvm/internal/Ref$ObjectRef +instanceKlass org/jetbrains/kotlin/psi/psiUtil/PsiUtilsKt$siblings$1 +instanceKlass org/jetbrains/kotlin/psi/psiUtil/PsiUtilsKt +instanceKlass org/jetbrains/kotlin/psi/KtQualifiedExpression$DefaultImpls +instanceKlass org/jetbrains/kotlin/psi/KtDotQualifiedExpression$Companion +instanceKlass org/jetbrains/kotlin/psi/KtStubbedPsiUtil +instanceKlass org/jetbrains/kotlin/psi/KtExpression$$Lambda$158 +instanceKlass org/jetbrains/kotlin/psi/UserDataProperty +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeProviderKt +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeProvider$DefaultImpls +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/WrappedProgressIndicator +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/impl/CoreProgressManager$$Lambda$157 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/impl/NonCancelableIndicator +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/StandardProgressIndicator +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/NonCancelableSection +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/LazyParseableElement$$Lambda$156 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/ILeafElementType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/ICustomParsingType +instanceKlass org/jetbrains/kotlin/com/intellij/lang/WhitespacesAndCommentsBinder$RecursiveBinder +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$RelativeTokenTextView +instanceKlass org/jetbrains/kotlin/parsing/PrecedingCommentsBinder +instanceKlass org/jetbrains/kotlin/parsing/AbstractTokenStreamPredicate +instanceKlass org/jetbrains/kotlin/parsing/AbstractTokenStreamPattern +instanceKlass org/jetbrains/kotlin/parsing/AbstractKotlinParsing$OptionalMarker +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction$$Lambda$155 +instanceKlass org/jetbrains/kotlin/com/intellij/util/IntIntFunction +instanceKlass org/jetbrains/kotlin/parsing/PrecedingDocCommentsBinder +instanceKlass org/jetbrains/kotlin/parsing/KotlinParsing$ModifierDetector +instanceKlass org/jetbrains/kotlin/com/intellij/lang/WhitespacesBinders$2 +instanceKlass org/jetbrains/kotlin/com/intellij/lang/WhitespacesBinders$1 +instanceKlass org/jetbrains/kotlin/com/intellij/lang/WhitespacesBinders +instanceKlass org/jetbrains/kotlin/parsing/TrailingCommentsBinder +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence +instanceKlass org/jetbrains/kotlin/BlockExpressionElementType$Companion +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/IReparseableElementTypeBase +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/ICompositeElementType +instanceKlass org/jetbrains/kotlin/KtNodeTypes +instanceKlass org/jetbrains/kotlin/com/google/common/collect/ImmutableCollection$Builder +instanceKlass java/util/AbstractMap$SimpleImmutableEntry +instanceKlass org/jetbrains/kotlin/com/google/common/collect/ImmutableMap$Builder +instanceKlass org/jetbrains/kotlin/parsing/TokenStreamPattern +instanceKlass org/jetbrains/kotlin/parsing/TokenStreamPredicate +instanceKlass org/jetbrains/kotlin/parsing/Consumer +instanceKlass org/jetbrains/kotlin/com/intellij/lang/WhitespacesAndCommentsBinder +instanceKlass org/jetbrains/kotlin/parsing/AbstractKotlinParsing +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter +instanceKlass org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilder +instanceKlass org/jetbrains/kotlin/parsing/KotlinParser +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$InnerLeaf +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/TokenSequence$Builder +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/TokenSequence +instanceKlass org/jetbrains/kotlin/com/intellij/lexer/TokenList +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$Token +instanceKlass org/jetbrains/kotlin/com/intellij/lang/LighterLazyParseableNode +instanceKlass gnu/trove/TIntArrayList +instanceKlass gnu/trove/TIntProcedure +instanceKlass java/util/BitSet +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/IntStack +instanceKlass org/jetbrains/kotlin/com/intellij/psi/text/BlockSupport +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/SharedImplUtil +instanceKlass org/jetbrains/kotlin/lexer/_JetLexer +instanceKlass org/jetbrains/kotlin/com/intellij/lexer/FlexLexer +instanceKlass org/jetbrains/kotlin/com/intellij/lexer/LexerPosition +instanceKlass org/jetbrains/kotlin/com/intellij/lang/WhitespacesAndCommentsBinder$TokenTextGetter +instanceKlass org/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker +instanceKlass org/jetbrains/kotlin/com/intellij/lang/SyntaxTreeBuilder$Marker +instanceKlass org/jetbrains/kotlin/com/intellij/util/diff/ShallowNodeComparator +instanceKlass org/jetbrains/kotlin/com/intellij/util/diff/DiffTreeChangeBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$ProductionMarker +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$Node +instanceKlass org/jetbrains/kotlin/com/intellij/lang/LighterASTNode +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/UnprotectedUserDataHolder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/DebugUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/LazyParseableElement$$Lambda$154 +instanceKlass org/jetbrains/kotlin/com/intellij/util/ThrowableRunnable +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/TreeUtil +instanceKlass org/jetbrains/kotlin/com/intellij/lang/LighterAST +instanceKlass org/jetbrains/kotlin/com/intellij/util/AstLoadingFilter$$Lambda$153 +instanceKlass org/jetbrains/kotlin/com/intellij/util/exception/FrequentErrorLogger +instanceKlass org/jetbrains/kotlin/com/intellij/util/AstLoadingFilter +instanceKlass javaslang/collection/HashArrayMappedTrieModule$AbstractNode +instanceKlass javaslang/collection/HashArrayMappedTrie +instanceKlass javaslang/collection/Set +instanceKlass javaslang/collection/Seq +instanceKlass javaslang/collection/Iterator +instanceKlass javaslang/collection/HashMap +instanceKlass javaslang/collection/Map +instanceKlass javaslang/collection/Traversable +instanceKlass javaslang/collection/Foldable +instanceKlass javaslang/Value +instanceKlass javaslang/Function1 +instanceKlass javaslang/\u03bb +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowInfoImpl$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowInfoImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowInfoFactory +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowInfo$Companion +instanceKlass kotlin/jvm/internal/markers/KMutableSet +instanceKlass kotlin/jvm/internal/markers/KMutableList +instanceKlass kotlin/jvm/internal/markers/KMutableCollection +instanceKlass kotlin/jvm/internal/markers/KMutableIterable +instanceKlass org/jetbrains/kotlin/serialization/konan/impl/KlibResolvedModuleDescriptorsFactoryImpl$Companion +instanceKlass org/jetbrains/kotlin/serialization/konan/impl/KlibResolvedModuleDescriptorsFactoryImpl +instanceKlass org/jetbrains/kotlin/serialization/konan/KlibResolvedModuleDescriptorsFactory +instanceKlass org/jetbrains/kotlin/serialization/konan/impl/KlibMetadataModuleDescriptorFactoryImpl +instanceKlass org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataModuleDescriptorFactory +instanceKlass org/jetbrains/kotlin/backend/common/serialization/metadata/impl/KlibMetadataDeserializedPackageFragmentsFactoryImpl +instanceKlass org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataDeserializedPackageFragmentsFactory +instanceKlass org/jetbrains/kotlin/descriptors/konan/impl/KlibModuleDescriptorFactoryImpl +instanceKlass org/jetbrains/kotlin/descriptors/konan/KlibModuleDescriptorFactory +instanceKlass org/jetbrains/kotlin/library/metadata/NullFlexibleTypeDeserializer +instanceKlass org/jetbrains/kotlin/konan/util/KlibMetadataFactories +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/TopDownAnalyzerFacadeForJVMKt +instanceKlass org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackagePartProvider +instanceKlass org/jetbrains/kotlin/context/MutableModuleContext$DefaultImpls +instanceKlass org/jetbrains/kotlin/resolve/CodeAnalyzerInitializer$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilderImpl$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilderImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/results/FlatSignatureForResolvedCallKt +instanceKlass org/jetbrains/kotlin/resolve/calls/CallExpressionResolver$Companion +instanceKlass org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsPackageFragmentProvider$Companion +instanceKlass org/jetbrains/kotlin/resolve/jvm/TopPackageNamesProvider +instanceKlass org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf$JvmFieldSignatureOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf$JvmPropertySignatureOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf$JvmMethodSignatureOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil +instanceKlass org/jetbrains/kotlin/load/kotlin/JavaFlexibleTypeDeserializer +instanceKlass org/jetbrains/kotlin/load/java/lazy/types/JavaTypeResolver +instanceKlass org/jetbrains/kotlin/load/java/lazy/TypeParameterResolver$EMPTY +instanceKlass org/jetbrains/kotlin/load/java/lazy/TypeParameterResolver +instanceKlass org/jetbrains/kotlin/load/java/components/TraceBasedErrorReporter$Companion +instanceKlass org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader$Kind$Companion +instanceKlass org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver$Companion +instanceKlass org/jetbrains/kotlin/util/slicedMap/Slices$2 +instanceKlass org/jetbrains/kotlin/util/slicedMap/Slices$1 +instanceKlass org/jetbrains/kotlin/util/slicedMap/RewritePolicy +instanceKlass org/jetbrains/kotlin/util/slicedMap/Slices +instanceKlass org/jetbrains/kotlin/load/java/components/FilesByFacadeFqNameIndexer$Companion +instanceKlass org/jetbrains/kotlin/com/intellij/util/SmartFMap +instanceKlass org/jetbrains/kotlin/resolve/ObservableBindingTrace +instanceKlass org/jetbrains/kotlin/resolve/ShadowedExtensionChecker +instanceKlass org/jetbrains/kotlin/descriptors/EffectiveVisibility +instanceKlass org/jetbrains/kotlin/resolve/ExposedVisibilityChecker +instanceKlass org/jetbrains/kotlin/resolve/DeclarationsChecker$Companion +instanceKlass org/jetbrains/kotlin/resolve/VarianceCheckerCore$Companion +instanceKlass org/jetbrains/kotlin/resolve/VarianceCheckerCore +instanceKlass org/jetbrains/kotlin/idea/MainFunctionDetector$Companion +instanceKlass org/jetbrains/kotlin/resolve/OverrideResolver$Companion +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeFactory$DefaultImportImpl +instanceKlass org/jetbrains/kotlin/util/collectionUtils/ScopeUtilsKt +instanceKlass org/jetbrains/kotlin/builtins/jvm/CloneableClassScope$Companion +instanceKlass org/jetbrains/kotlin/descriptors/TypeParameterUtilsKt +instanceKlass org/jetbrains/kotlin/incremental/UtilsKt +instanceKlass org/jetbrains/kotlin/builtins/functions/FunctionClassKind$Companion +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor$EnumEntryClassDescriptors +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedAnnotations +instanceKlass org/jetbrains/kotlin/descriptors/impl/AbstractTypeParameterDescriptor$2 +instanceKlass org/jetbrains/kotlin/descriptors/impl/AbstractTypeParameterDescriptor$1 +instanceKlass org/jetbrains/kotlin/descriptors/SupertypeLoopChecker$EMPTY +instanceKlass org/jetbrains/kotlin/descriptors/ScopesHolderForClass$Companion +instanceKlass org/jetbrains/kotlin/descriptors/ScopesHolderForClass +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ProtoEnumFlagsUtilsKt$WhenMappings +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ProtoEnumFlagsUtilsKt +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ProtoEnumFlags$WhenMappings +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$MemberKind$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Class$Kind$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Modality$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Visibility$1 +instanceKlass org/jetbrains/kotlin/metadata/deserialization/Flags$FlagField +instanceKlass org/jetbrains/kotlin/metadata/deserialization/Flags +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ProtoEnumFlags +instanceKlass org/jetbrains/kotlin/descriptors/DeserializedDescriptor +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer$ClassKey +instanceKlass org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope$Companion +instanceKlass org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope +instanceKlass org/jetbrains/kotlin/descriptors/PackageFragmentProviderKt +instanceKlass org/jetbrains/kotlin/descriptors/impl/CompositePackageFragmentProvider +instanceKlass org/jetbrains/kotlin/resolve/scopes/MemberScope$Companion +instanceKlass org/jetbrains/kotlin/resolve/scopes/DescriptorKindFilter$Companion$MaskToName +instanceKlass org/jetbrains/kotlin/resolve/scopes/DescriptorKindFilter$Companion +instanceKlass org/jetbrains/kotlin/resolve/scopes/DescriptorKindFilter +instanceKlass org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter +instanceKlass org/jetbrains/kotlin/resolve/PlatformDependentAnalyzerServices$DefaultImportsKey +instanceKlass org/jetbrains/kotlin/resolve/VariableTypeAndInitializerResolver$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/components/NewOverloadingConflictResolver$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/KotlinConstraintSystemCompleter$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/PostponedArgumentInputTypesResolver$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver$SpecificityComparisonWithNumerics$1 +instanceKlass org/jetbrains/kotlin/resolve/calls/results/SpecificityComparisonCallbacks +instanceKlass org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver$resolvedCallHashingStrategy$1 +instanceKlass org/jetbrains/kotlin/resolve/calls/components/CallableReferenceOverloadConflictResolver$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/TrivialConstraintTypeInferenceOracle$Companion +instanceKlass org/jetbrains/kotlin/types/AbstractTypeApproximator$Companion +instanceKlass org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/SmartCastManager$Companion +instanceKlass org/jetbrains/kotlin/resolve/StatementFilter$Companion +instanceKlass org/jetbrains/kotlin/resolve/AnnotationChecker$Companion +instanceKlass org/jetbrains/kotlin/resolve/TypeResolver$Companion +instanceKlass org/jetbrains/kotlin/resolve/QualifiedExpressionResolver$Companion +instanceKlass org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator$Companion$ExperimentalityDiagnostic1 +instanceKlass org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator$Companion +instanceKlass org/jetbrains/kotlin/util/CounterWithExclude$Companion +instanceKlass org/jetbrains/kotlin/util/ReenterableCounter$Companion +instanceKlass org/jetbrains/kotlin/container/MethodBinding +instanceKlass org/jetbrains/kotlin/resolve/lazy/ResolveSession$$Lambda$152 +instanceKlass org/jetbrains/kotlin/resolve/lazy/ResolveSession$$Lambda$151 +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyAnnotations +instanceKlass org/jetbrains/kotlin/resolve/lazy/ResolveSession$1 +instanceKlass org/jetbrains/kotlin/storage/LockBasedLazyResolveStorageManager$LockProtectedContext +instanceKlass org/jetbrains/kotlin/storage/LockBasedLazyResolveStorageManager$LockProtectedTrace +instanceKlass org/jetbrains/kotlin/storage/LockBasedLazyResolveStorageManager +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker$Companion +instanceKlass org/jetbrains/kotlin/descriptors/annotations/KotlinTarget$Companion +instanceKlass org/jetbrains/kotlin/resolve/jvm/modules/JavaModuleResolver$SERVICE +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/InlinePlatformCompatibilityChecker$Companion +instanceKlass org/jetbrains/kotlin/resolve/LanguageVersionSettingsProvider$Companion +instanceKlass org/jetbrains/kotlin/resolve/LanguageVersionSettingsProvider +instanceKlass org/jetbrains/kotlin/synthetic/SyntheticScopeProviderExtension +instanceKlass org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope$Companion +instanceKlass org/jetbrains/kotlin/resolve/scopes/SyntheticScope$Default +instanceKlass org/jetbrains/kotlin/resolve/scopes/SyntheticScope +instanceKlass org/jetbrains/kotlin/resolve/deprecation/DeprecationResolver$Companion +instanceKlass org/jetbrains/kotlin/resolve/deprecation/CoroutineCompatibilitySupport$Companion +instanceKlass org/jetbrains/kotlin/container/IterableDescriptor +instanceKlass org/jetbrains/kotlin/builtins/ReflectionTypes$ClassLookup +instanceKlass org/jetbrains/kotlin/builtins/ReflectionTypes$Companion +instanceKlass org/jetbrains/kotlin/container/ConstructorBinding +instanceKlass org/jetbrains/kotlin/container/ResolveKt +instanceKlass org/jetbrains/kotlin/container/SingletonDescriptor$WhenMappings +instanceKlass org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$Storage +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ProtoContainer +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass$AnnotationArgumentVisitor +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/NullabilityQualifierWithMigrationStatus +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/JavaTypeEnhancement +instanceKlass org/jetbrains/kotlin/load/java/AnnotationTypeQualifierResolver$TypeQualifierWithApplicability +instanceKlass org/jetbrains/kotlin/load/java/JavaDefaultQualifiers +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ClassData +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/SignatureEnhancement +instanceKlass org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver +instanceKlass org/jetbrains/kotlin/load/java/lazy/LazyJavaResolverContext +instanceKlass org/jetbrains/kotlin/load/java/lazy/JavaResolverComponents +instanceKlass org/jetbrains/kotlin/resolve/inline/ReasonableInlineRule +instanceKlass org/jetbrains/kotlin/resolve/AnalyzerExtensions +instanceKlass org/jetbrains/kotlin/resolve/ControlFlowAnalyzer +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeFactory$DefaultImportResolvers +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeFactory$DummyContainerDescriptor +instanceKlass org/jetbrains/kotlin/resolve/lazy/ImportResolutionComponents +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeFactory +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeProviderImpl +instanceKlass org/jetbrains/kotlin/resolve/lazy/ImportForceResolver +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopes +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiErrorElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiPlainTextFile +instanceKlass org/jetbrains/kotlin/com/intellij/psi/templateLanguages/OuterLanguageElement +instanceKlass org/jetbrains/kotlin/resolve/calls/context/CallPosition +instanceKlass org/jetbrains/kotlin/resolve/checkers/PlatformDiagnosticSuppressor$Default +instanceKlass org/jetbrains/kotlin/resolve/DeclarationsChecker +instanceKlass org/jetbrains/kotlin/types/expressions/FakeCallResolver$RealExpression +instanceKlass org/jetbrains/kotlin/resolve/calls/context/TemporaryTraceAndCache +instanceKlass org/jetbrains/kotlin/resolve/calls/results/ResolutionResultsHandler +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/ReceiverValueWithSmartCastInfo +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/ImplicitsExtensionsResolutionFilter$Default +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/TypeVariableDependencyInformationProvider +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder$VariableForFixation +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/VariableWithConstraints +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionContext +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder$Context +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver$Context +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/PostponedArgumentInputTypesResolver +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver +instanceKlass org/jetbrains/kotlin/resolve/calls/components/CallableReferenceCandidate +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemBuilder +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystemOperation +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ReturnArgumentsAnalysisResult +instanceKlass org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer$SubstitutorAndStubsForLambdaAnalysis +instanceKlass org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzerContext +instanceKlass org/jetbrains/kotlin/resolve/calls/model/SimpleCandidateFactory +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/CandidateFactory +instanceKlass org/jetbrains/kotlin/resolve/calls/model/KotlinDiagnosticsHolder$SimpleHolder +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/TowerData +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/TowerResolver$ResultCollector +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/ScopeTowerProcessor +instanceKlass org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver +instanceKlass org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/TowerResolver +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/NewAbstractResolvedCall +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/NewTypeSubstitutor +instanceKlass org/jetbrains/kotlin/resolve/calls/components/AdditionalDiagnosticReporter +instanceKlass org/jetbrains/kotlin/types/TypeApproximatorConfiguration +instanceKlass org/jetbrains/kotlin/types/AbstractTypeApproximator$ApproximationResult +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/Constraint +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintIncorporator$Context +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/TrivialConstraintTypeInferenceOracle +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector$Context +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintIncorporator +instanceKlass org/jetbrains/kotlin/resolve/calls/components/TypeArgumentsToParametersMapper$TypeArgumentsMapping +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper$ArgumentMapping +instanceKlass org/jetbrains/kotlin/resolve/calls/components/TypeArgumentsToParametersMapper +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/PSIKotlinCallArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionCallbacksImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ResolvedAtom +instanceKlass org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/KotlinConstraintSystemCompleter +instanceKlass org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/ImplicitsExtensionsResolutionFilter +instanceKlass org/jetbrains/kotlin/resolve/calls/KotlinCallResolver +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer +instanceKlass org/jetbrains/kotlin/resolve/calls/model/KotlinCallComponents +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/CoroutineInferenceSupport +instanceKlass org/jetbrains/kotlin/resolve/calls/CandidateResolver$ValueArgumentsCheckingResult +instanceKlass org/jetbrains/kotlin/types/expressions/ClassLiteralChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/SmartCastResult +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Ref +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/SmartCastManager +instanceKlass org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver$ResolutionResultsAndTraceCommitCallback +instanceKlass org/jetbrains/kotlin/types/expressions/DoubleColonLHS +instanceKlass org/jetbrains/kotlin/types/FunctionPlaceholders +instanceKlass org/jetbrains/kotlin/resolve/calls/model/MutableResolvedCall +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/ConstraintSystem$Builder +instanceKlass org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResultsImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/CandidateResolver +instanceKlass org/jetbrains/kotlin/resolve/calls/GenericCandidateResolver +instanceKlass org/jetbrains/kotlin/resolve/calls/ArgumentTypeResolver +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference +instanceKlass org/jetbrains/kotlin/resolve/calls/tasks/ResolutionCandidate +instanceKlass org/jetbrains/kotlin/psi/KtOperationExpression +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/ExpressionReceiver +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver +instanceKlass org/jetbrains/kotlin/resolve/calls/CallCompleter +instanceKlass org/jetbrains/kotlin/resolve/DelegatingBindingTrace +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/NewResolutionOldInference$ResolutionKind +instanceKlass org/jetbrains/kotlin/resolve/calls/model/MutableDataFlowInfoForArguments +instanceKlass org/jetbrains/kotlin/resolve/calls/model/DataFlowInfoForArguments +instanceKlass org/jetbrains/kotlin/resolve/calls/tasks/TracingStrategy +instanceKlass org/jetbrains/kotlin/resolve/ModifiersChecker$ModifiersCheckingProcedure +instanceKlass org/jetbrains/kotlin/resolve/constants/CompileTimeConstant +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/ConditionalDataFlowInfo +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/RttiExpressionChecker +instanceKlass org/jetbrains/kotlin/resolve/MissingSupertypesResolver +instanceKlass org/jetbrains/kotlin/resolve/CollectionLiteralResolver +instanceKlass org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver +instanceKlass org/jetbrains/kotlin/types/expressions/FakeCallResolver +instanceKlass org/jetbrains/kotlin/resolve/DeclarationsCheckerBuilder +instanceKlass org/jetbrains/kotlin/resolve/LocalVariableResolver +instanceKlass org/jetbrains/kotlin/types/expressions/ForLoopConventionsChecker +instanceKlass org/jetbrains/kotlin/types/expressions/LocalClassifierAnalyzer +instanceKlass org/jetbrains/kotlin/types/expressions/DataFlowAnalyzer +instanceKlass org/jetbrains/kotlin/resolve/calls/CallExpressionResolver +instanceKlass org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils +instanceKlass org/jetbrains/kotlin/types/expressions/ValueParameterResolver +instanceKlass org/jetbrains/kotlin/contracts/EffectSystem +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionCallbacksImpl$LambdaInfo +instanceKlass org/jetbrains/kotlin/types/expressions/KotlinTypeInfo +instanceKlass org/jetbrains/kotlin/resolve/StatementFilter +instanceKlass org/jetbrains/kotlin/resolve/AnnotationChecker +instanceKlass org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents +instanceKlass org/jetbrains/kotlin/types/expressions/ExpressionTypingInternals +instanceKlass org/jetbrains/kotlin/types/expressions/ExpressionTypingFacade +instanceKlass org/jetbrains/kotlin/resolve/DelegatedPropertyResolver +instanceKlass org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage +instanceKlass org/jetbrains/kotlin/types/AbstractTypeApproximator +instanceKlass org/jetbrains/kotlin/types/expressions/DestructuringDeclarationResolver +instanceKlass org/jetbrains/kotlin/resolve/VariableTypeAndInitializerResolver +instanceKlass org/jetbrains/kotlin/resolve/scopes/LocalRedeclarationChecker +instanceKlass org/jetbrains/kotlin/types/expressions/ExpressionTypingServices +instanceKlass org/jetbrains/kotlin/contracts/parsing/ContractParsingServices +instanceKlass org/jetbrains/kotlin/resolve/OverloadChecker +instanceKlass org/jetbrains/kotlin/resolve/ModifiersChecker +instanceKlass org/jetbrains/kotlin/types/SubtypingRepresentatives +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/Qualifier +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/QualifierReceiver +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/DetailedReceiver +instanceKlass org/jetbrains/kotlin/resolve/QualifiedExpressionResolver$QualifiedExpressionResolveResult +instanceKlass org/jetbrains/kotlin/incremental/KotlinLookupLocation +instanceKlass org/jetbrains/kotlin/resolve/scopes/ImportingScope +instanceKlass org/jetbrains/kotlin/resolve/QualifiedExpressionResolver$QualifierPart +instanceKlass org/jetbrains/kotlin/resolve/PossiblyBareType +instanceKlass org/jetbrains/kotlin/resolve/QualifiedExpressionResolver$TypeQualifierResolutionResult +instanceKlass org/jetbrains/kotlin/descriptors/TypeAliasDescriptor +instanceKlass org/jetbrains/kotlin/resolve/TypeResolutionContext +instanceKlass org/jetbrains/kotlin/resolve/calls/tasks/DynamicCallableDescriptors +instanceKlass org/jetbrains/kotlin/resolve/sam/SamWithReceiverResolver +instanceKlass org/jetbrains/kotlin/psi/Call +instanceKlass org/jetbrains/kotlin/resolve/deprecation/Deprecation +instanceKlass org/jetbrains/kotlin/resolve/deprecation/CoroutineCompatibilitySupport +instanceKlass org/jetbrains/kotlin/idea/MainFunctionDetector +instanceKlass org/jetbrains/kotlin/load/java/AnnotationTypeQualifierResolver +instanceKlass org/jetbrains/kotlin/load/java/descriptors/JavaClassDescriptor +instanceKlass org/jetbrains/kotlin/builtins/jvm/JvmBuiltIns$Settings +instanceKlass sun/reflect/generics/tree/BooleanSignature +instanceKlass org/jetbrains/kotlin/load/java/sources/JavaSourceElement +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaPackage +instanceKlass org/jetbrains/kotlin/load/java/JavaClassFinder$Request +instanceKlass org/jetbrains/kotlin/load/java/components/SignaturePropagator$PropagatedSignature +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaMethod +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaField +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaMember +instanceKlass org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader +instanceKlass org/jetbrains/kotlin/load/kotlin/JavaClassDataFinder +instanceKlass org/jetbrains/kotlin/load/java/lazy/LazyJavaPackageFragmentProvider +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinClassFinder$Result +instanceKlass org/jetbrains/kotlin/resolve/lazy/data/KtClassLikeInfo +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/module/Module +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ResolvedValueArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResults +instanceKlass org/jetbrains/kotlin/resolve/scopes/LexicalScope +instanceKlass org/jetbrains/kotlin/resolve/scopes/HierarchicalScope +instanceKlass org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator +instanceKlass org/jetbrains/kotlin/resolve/calls/CallResolver +instanceKlass org/jetbrains/kotlin/resolve/TopDownAnalysisContext +instanceKlass org/jetbrains/kotlin/resolve/BodiesResolveContext +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowInfo +instanceKlass org/jetbrains/kotlin/resolve/FilePreprocessor +instanceKlass org/jetbrains/kotlin/resolve/QualifiedExpressionResolver +instanceKlass org/jetbrains/kotlin/resolve/BodyResolver +instanceKlass org/jetbrains/kotlin/resolve/VarianceChecker +instanceKlass org/jetbrains/kotlin/resolve/OverloadResolver +instanceKlass org/jetbrains/kotlin/resolve/OverrideResolver +instanceKlass org/jetbrains/kotlin/resolve/DeclarationResolver +instanceKlass org/jetbrains/kotlin/container/SetterInfo +instanceKlass org/jetbrains/kotlin/javax/inject/Inject +instanceKlass org/jetbrains/kotlin/resolve/calls/components/InferenceSession +instanceKlass org/jetbrains/kotlin/resolve/lazy/DeclarationScopeProviderImpl +instanceKlass org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeProvider +instanceKlass org/jetbrains/kotlin/descriptors/ClassDescriptorWithResolutionScopes +instanceKlass org/jetbrains/kotlin/resolve/DescriptorResolver +instanceKlass org/jetbrains/kotlin/resolve/checkers/PlatformDiagnosticSuppressor +instanceKlass org/jetbrains/kotlin/resolve/FunctionDescriptorResolver +instanceKlass org/jetbrains/kotlin/resolve/lazy/LazyEntity +instanceKlass org/jetbrains/kotlin/resolve/TypeResolver +instanceKlass org/jetbrains/kotlin/resolve/lazy/DeclarationScopeProvider +instanceKlass org/jetbrains/kotlin/resolve/lazy/descriptors/LazyAnnotationsContext +instanceKlass org/jetbrains/kotlin/storage/LazyResolveStorageManager +instanceKlass org/jetbrains/kotlin/incremental/components/Position +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/OnlyInputTypeConstraintPosition +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintPosition +instanceKlass org/jetbrains/kotlin/resolve/calls/model/PostponedAtomWithRevisableExpectedType +instanceKlass org/jetbrains/kotlin/resolve/calls/model/PostponedResolvedAtomMarker +instanceKlass org/jetbrains/kotlin/types/model/RawTypeMarker +instanceKlass org/jetbrains/kotlin/types/model/StubTypeMarker +instanceKlass org/jetbrains/kotlin/types/model/DynamicTypeMarker +instanceKlass org/jetbrains/kotlin/types/model/TypeVariableTypeConstructorMarker +instanceKlass org/jetbrains/kotlin/types/model/CapturedTypeConstructorMarker +instanceKlass org/jetbrains/kotlin/types/model/TypeVariableMarker +instanceKlass org/jetbrains/kotlin/types/model/CapturedTypeMarker +instanceKlass org/jetbrains/kotlin/types/model/FlexibleTypeMarker +instanceKlass org/jetbrains/kotlin/types/model/DefinitelyNotNullTypeMarker +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker$Companion +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker$ExperimentalityDiagnostic2 +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker$ExperimentalityDiagnostic +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker$Experimentality +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker$ExperimentalityDiagnostics +instanceKlass org/jetbrains/kotlin/resolve/calls/components/KotlinResolutionCallbacks +instanceKlass org/jetbrains/kotlin/resolve/calls/model/KotlinResolutionCandidate +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/Candidate +instanceKlass org/jetbrains/kotlin/resolve/calls/model/KotlinDiagnosticsHolder +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/ImplicitScopeTower +instanceKlass org/jetbrains/kotlin/resolve/calls/model/CallableReferenceKotlinCallArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/model/PostponableKotlinCallArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/results/SimpleConstraintSystem +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector +instanceKlass org/jetbrains/kotlin/resolve/calls/model/SimpleKotlinCallArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ReceiverKotlinCallArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/model/KotlinCallArgument +instanceKlass org/jetbrains/kotlin/resolve/calls/model/KotlinCall +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ResolutionAtom +instanceKlass org/jetbrains/kotlin/types/AbstractTypeCheckerContext +instanceKlass org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver$Compatibility +instanceKlass org/jetbrains/kotlin/descriptors/ValueParameterDescriptor +instanceKlass org/jetbrains/kotlin/resolve/deprecation/DeprecationResolver +instanceKlass org/jetbrains/kotlin/builtins/ReflectionTypes +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValue +instanceKlass org/jetbrains/kotlin/resolve/UpperBoundViolatedReporter +instanceKlass org/jetbrains/kotlin/types/TypeSubstitutor +instanceKlass org/jetbrains/kotlin/types/model/TypeSubstitutorMarker +instanceKlass org/jetbrains/kotlin/descriptors/TypeParameterDescriptor +instanceKlass org/jetbrains/kotlin/types/model/TypeParameterMarker +instanceKlass kotlin/jvm/JvmStatic +instanceKlass java/util/function/IntFunction +instanceKlass java/lang/reflect/WildcardType +instanceKlass sun/reflect/generics/tree/MethodTypeSignature +instanceKlass sun/reflect/generics/tree/VoidDescriptor +instanceKlass sun/reflect/generics/tree/Wildcard +instanceKlass sun/reflect/generics/tree/BottomSignature +instanceKlass org/jetbrains/kotlin/diagnostics/DiagnosticSink$DiagnosticsCallback +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/ListenerDescriptor +instanceKlass kotlin/ReplaceWith +instanceKlass kotlin/Deprecated +instanceKlass org/jetbrains/kotlin/descriptors/DeclarationDescriptorVisitor +instanceKlass kotlin/reflect/jvm/internal/pcollections/ConsPStack$Itr +instanceKlass org/jetbrains/kotlin/idea/MainFunctionDetector$Factory$Ordinary +instanceKlass org/jetbrains/kotlin/idea/MainFunctionDetector$Factory +instanceKlass org/jetbrains/kotlin/resolve/ModuleStructureOracle$SingleModule +instanceKlass org/jetbrains/kotlin/resolve/ModuleStructureOracle +instanceKlass org/jetbrains/kotlin/resolve/lazy/BasicAbsentDescriptorHandler +instanceKlass org/jetbrains/kotlin/resolve/lazy/AbsentDescriptorHandler +instanceKlass org/jetbrains/kotlin/resolve/lazy/CompilerLocalDescriptorResolver +instanceKlass org/jetbrains/kotlin/resolve/lazy/LocalDescriptorResolver +instanceKlass org/jetbrains/kotlin/resolve/BodyResolveCache$ThrowException +instanceKlass org/jetbrains/kotlin/resolve/BodyResolveCache +instanceKlass org/jetbrains/kotlin/resolve/jvm/JvmDiagnosticComponents +instanceKlass org/jetbrains/kotlin/platform/PlatformSpecificDiagnosticComponents +instanceKlass org/jetbrains/kotlin/load/java/components/FilesByFacadeFqNameIndexer +instanceKlass org/jetbrains/kotlin/resolve/FilePreprocessorExtension +instanceKlass org/jetbrains/kotlin/load/java/lazy/JavaResolverSettings$Companion$create$1 +instanceKlass org/jetbrains/kotlin/load/java/lazy/JavaResolverSettings$Companion +instanceKlass org/jetbrains/kotlin/load/java/lazy/JavaResolverSettings +instanceKlass org/jetbrains/kotlin/load/java/JavaClassesTracker$Default +instanceKlass org/jetbrains/kotlin/load/java/JavaClassesTracker +instanceKlass org/jetbrains/kotlin/resolve/jvm/multiplatform/OptionalAnnotationPackageFragmentProvider +instanceKlass org/jetbrains/kotlin/serialization/deserialization/AbstractDeserializedPackageFragmentProvider +instanceKlass org/jetbrains/kotlin/load/java/components/JavaSourceElementFactoryImpl +instanceKlass org/jetbrains/kotlin/load/java/sources/JavaSourceElementFactory +instanceKlass org/jetbrains/kotlin/load/java/components/AbstractJavaResolverCache +instanceKlass org/jetbrains/kotlin/load/java/components/JavaResolverCache +instanceKlass org/jetbrains/kotlin/load/java/AbstractJavaClassFinder +instanceKlass org/jetbrains/kotlin/load/java/JavaClassFinder +instanceKlass org/jetbrains/kotlin/load/java/components/JavaDeprecationSettings +instanceKlass org/jetbrains/kotlin/resolve/deprecation/DeprecationSettings +instanceKlass org/jetbrains/kotlin/resolve/TypeResolver$TypeTransformerForTests +instanceKlass org/jetbrains/kotlin/load/java/components/TraceBasedErrorReporter +instanceKlass org/jetbrains/kotlin/load/java/components/SignaturePropagatorImpl +instanceKlass org/jetbrains/kotlin/load/java/components/SignaturePropagator +instanceKlass org/jetbrains/kotlin/load/java/components/JavaPropertyInitializerEvaluatorImpl +instanceKlass org/jetbrains/kotlin/load/java/components/JavaPropertyInitializerEvaluator +instanceKlass org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava +instanceKlass org/jetbrains/kotlin/resolve/jvm/JavaDescriptorResolver +instanceKlass org/jetbrains/kotlin/load/kotlin/VirtualFileFinder$SERVICE +instanceKlass org/jetbrains/kotlin/load/kotlin/VirtualFileFinder +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinClassFinder +instanceKlass org/jetbrains/kotlin/serialization/deserialization/KotlinMetadataFinder +instanceKlass org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory$SERVICE +instanceKlass org/jetbrains/kotlin/resolve/AnnotationResolver +instanceKlass org/jetbrains/kotlin/resolve/LazyTopDownAnalyzer +instanceKlass org/jetbrains/kotlin/resolve/lazy/ResolveSession +instanceKlass org/jetbrains/kotlin/resolve/lazy/LazyClassContext +instanceKlass org/jetbrains/kotlin/resolve/lazy/KotlinCodeAnalyzer +instanceKlass org/jetbrains/kotlin/resolve/lazy/TopLevelDescriptorProvider +instanceKlass org/jetbrains/kotlin/util/ProgressManagerBasedCancellationChecker +instanceKlass org/jetbrains/kotlin/util/CancellationChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ClassicConstraintSystemUtilContext +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemUtilContext +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ClassicTypeSystemContextForCS +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemInferenceExtensionContextDelegate +instanceKlass org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemInferenceExtensionContext +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemCommonSuperTypesContext +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemTypeFactoryContext +instanceKlass org/jetbrains/kotlin/types/model/TypeCheckerProviderContext +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemBuiltInsContext +instanceKlass org/jetbrains/kotlin/types/TypeSystemCommonBackendContext +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemContext +instanceKlass org/jetbrains/kotlin/types/model/TypeSystemOptimizationContext +instanceKlass org/jetbrains/kotlin/resolve/calls/components/BuiltInsProvider +instanceKlass org/jetbrains/kotlin/contracts/ContractDeserializerImpl +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker$ClassifierUsage +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker$Overrides +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueFactoryImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueFactory +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/components/KotlinResolutionStatelessCallbacks +instanceKlass org/jetbrains/kotlin/resolve/SupertypeLoopCheckerImpl +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeAnnotationChecker$Companion +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeAnnotationChecker +instanceKlass kotlinx/android/parcel/IgnoredOnParcel +instanceKlass kotlinx/parcelize/IgnoredOnParcel +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeDeclarationChecker$Companion +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeDeclarationChecker +instanceKlass org/jetbrains/kotlin/kapt3/KaptAnonymousTypeTransformer +instanceKlass org/jetbrains/kotlin/resolve/DeclarationSignatureAnonymousTypeTransformer +instanceKlass org/jetbrains/kotlin/platform/jvm/JvmPlatformKt +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExperimentalMarkerDeclarationAnnotationChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/multiplatform/JavaActualAnnotationArgumentExtractor +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker$ActualAnnotationArgumentExtractor +instanceKlass org/jetbrains/kotlin/types/expressions/GenericArrayClassLiteralSupport$Enabled +instanceKlass org/jetbrains/kotlin/types/expressions/GenericArrayClassLiteralSupport +instanceKlass org/jetbrains/kotlin/types/expressions/FunctionWithBigAritySupport$LanguageVersionDependent +instanceKlass org/jetbrains/kotlin/types/expressions/FunctionWithBigAritySupport +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmRecordApplicabilityChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/JvmAdditionalClassPartsProvider +instanceKlass org/jetbrains/kotlin/resolve/AdditionalClassPartsProvider +instanceKlass org/jetbrains/kotlin/load/java/sam/JvmSamConversionOracle +instanceKlass org/jetbrains/kotlin/resolve/sam/SamConversionOracle +instanceKlass org/jetbrains/kotlin/resolve/jvm/platform/JvmDefaultSuperCallChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/JvmPlatformOverloadsSpecificityComparator +instanceKlass org/jetbrains/kotlin/resolve/calls/results/PlatformOverloadsSpecificityComparator +instanceKlass org/jetbrains/kotlin/resolve/jvm/JvmTypeSpecificityComparator +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmModuleAccessibilityChecker$ClassifierUsage +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmModuleAccessibilityChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/InlinePlatformCompatibilityChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmDefaultChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/InterfaceDefaultMethodCallChecker +instanceKlass org/jetbrains/kotlin/synthetic/JavaSyntheticScopes +instanceKlass org/jetbrains/kotlin/resolve/scopes/SyntheticScopes +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/AbstractReflectionApiCallChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmStaticChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JavaNullabilityChecker +instanceKlass org/jetbrains/kotlin/container/SingletonDescriptor +instanceKlass org/jetbrains/kotlin/resolve/UpperBoundChecker +instanceKlass org/jetbrains/kotlin/frontend/di/InjectionKt +instanceKlass org/jetbrains/kotlin/container/ComponentDescriptor$DefaultImpls +instanceKlass org/jetbrains/kotlin/types/WrappedTypeFactory +instanceKlass sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl +instanceKlass org/jetbrains/kotlin/resolve/calls/context/ResolutionContext +instanceKlass org/jetbrains/kotlin/synthetic/SyntheticJavaPropertyDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/SyntheticPropertyDescriptor +instanceKlass org/jetbrains/kotlin/resolve/checkers/ClassifierUsageCheckerContext +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/CallCheckerContext +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ResolvedCall +instanceKlass org/jetbrains/kotlin/descriptors/annotations/AnnotationDescriptor +instanceKlass org/jetbrains/kotlin/types/model/AnnotationMarker +instanceKlass org/jetbrains/kotlin/container/DefaultImplementation +instanceKlass java/lang/WeakPairMap$$Lambda$150 +instanceKlass java/lang/Module$$Lambda$149 +instanceKlass java/lang/module/ModuleDescriptor$Builder$$Lambda$148 +instanceKlass jdk/internal/module/Checks +instanceKlass java/lang/module/ModuleDescriptor$Builder +instanceKlass java/lang/reflect/Proxy$ProxyBuilder$$Lambda$147 +instanceKlass jdk/internal/HotSpotIntrinsicCandidate +instanceKlass org/jetbrains/kotlin/resolve/checkers/DeclarationCheckerContext +instanceKlass org/jetbrains/kotlin/resolve/checkers/CheckerContext +instanceKlass org/jetbrains/kotlin/container/ConstructorInfo +instanceKlass org/jetbrains/kotlin/container/ClassInfo +instanceKlass org/jetbrains/kotlin/container/ClassTraversalCache +instanceKlass org/jetbrains/kotlin/container/CacheKt +instanceKlass org/jetbrains/kotlin/container/DynamicComponentDescriptor +instanceKlass org/jetbrains/kotlin/container/ComponentResolveContext +instanceKlass org/jetbrains/kotlin/container/ValueResolveContext +instanceKlass org/jetbrains/kotlin/container/InstanceComponentDescriptor +instanceKlass org/jetbrains/kotlin/container/ComponentDescriptor +instanceKlass org/jetbrains/kotlin/container/ValueDescriptor +instanceKlass org/jetbrains/kotlin/container/ContainerKt +instanceKlass org/jetbrains/kotlin/types/DynamicTypesSettings +instanceKlass org/jetbrains/kotlin/resolve/calls/results/TypeSpecificityComparator$NONE +instanceKlass org/jetbrains/kotlin/resolve/calls/results/TypeSpecificityComparator +instanceKlass org/jetbrains/kotlin/resolve/checkers/OptionalExpectationUsageChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/MissingDependencyClassChecker$ClassifierUsage +instanceKlass org/jetbrains/kotlin/resolve/checkers/ApiVersionClassifierUsageChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/DeprecatedClassifierUsageChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/VarargWrongExecutionOrderChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/ReferencingToUnderscoreNamedParameterOfCatchBlockChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/NullableExtensionOperatorWithSafeCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/FunInterfaceConstructorReferenceChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/UnitConversionCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/SuspendConversionCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/AbstractClassInstantiationChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/MissingDependencySupertypeChecker$ForCalls +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/ReifiedTypeParameterSubstitutionChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/ContractNotAllowedCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/NamedFunAsExpressionChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/NullableVarargArgumentCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/ResultTypeWithNullableOperatorsChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/UselessElvisCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/LambdaWithSuspendModifierCallChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/PrimitiveNumericComparisonCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/ImplicitNothingAsTypeParameterCallChecker +instanceKlass org/jetbrains/kotlin/diagnostics/Errors$Initializer$$Lambda$146 +instanceKlass org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages$Extension +instanceKlass org/jetbrains/kotlin/diagnostics/rendering/DiagnosticFactoryToRendererMap +instanceKlass org/jetbrains/kotlin/diagnostics/Errors$Initializer +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Hashing +instanceKlass org/jetbrains/kotlin/com/google/common/math/IntMath$1 +instanceKlass org/jetbrains/kotlin/com/google/common/math/MathPreconditions +instanceKlass org/jetbrains/kotlin/com/google/common/math/IntMath +instanceKlass org/jetbrains/kotlin/com/google/common/collect/ImmutableSet$SetBuilderImpl +instanceKlass org/jetbrains/kotlin/diagnostics/ParametrizedDiagnostic +instanceKlass org/jetbrains/kotlin/diagnostics/Diagnostic +instanceKlass org/jetbrains/kotlin/diagnostics/Errors +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/MigrationDiagnostics +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/AssigningNamedArgumentToVarargChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/UnderscoreUsageChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/LateinitIntrinsicApplicabilityChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/CallableReferenceCompatibilityChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/MissingDependencyClassChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/DslScopeViolationCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/BuilderFunctionsCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/CoroutineSuspendCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/ApiVersionCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/ProtectedConstructorCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/ConstructorHeaderCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/OperatorCallChecker$Companion +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/OperatorCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/InfixCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/CallReturnsArrayOfNothingChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/DeprecatedCallChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/TrailingCommaCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/SafeCallChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/InlineCheckerWrapper +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/CapturingInClosureChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/SealedInterfaceAllowedChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/SealedInheritorInSameModuleChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/SealedInheritorInSamePackageChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/PrivateInlineFunctionsReturningAnonymousObjectsChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/ContractDescriptionBlockChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/DeprecatedSinceKotlinAnnotationChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/FunInterfaceDeclarationChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/MissingDependencySupertypeChecker$ForDeclarations +instanceKlass org/jetbrains/kotlin/resolve/checkers/TrailingCommaDeclarationChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/TailrecFunctionChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExplicitApiDeclarationChecker$Companion +instanceKlass org/jetbrains/kotlin/resolve/checkers/ExplicitApiDeclarationChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/LocalVariableTypeParametersChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/ResultClassInReturnTypeChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/ReservedMembersAndConstructsForInlineClass$Companion +instanceKlass org/jetbrains/kotlin/resolve/checkers/ReservedMembersAndConstructsForInlineClass +instanceKlass org/jetbrains/kotlin/resolve/checkers/AnnotationClassTargetAndRetentionChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/InnerClassInsideInlineClass +instanceKlass org/jetbrains/kotlin/resolve/checkers/PropertiesWithBackingFieldsInsideInlineClass +instanceKlass org/jetbrains/kotlin/resolve/checkers/InlineClassDeclarationChecker +instanceKlass org/jetbrains/kotlin/util/OperatorNameConventions +instanceKlass org/jetbrains/kotlin/resolve/checkers/SuspendLimitationsChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/KClassWithIncorrectTypeArgumentChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/DelegationChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/DynamicReceiverChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/ReifiedTypeParameterAnnotationChecker +instanceKlass org/jetbrains/kotlin/resolve/RequireKotlinConstants +instanceKlass org/jetbrains/kotlin/resolve/AnnotationsKt +instanceKlass org/jetbrains/kotlin/resolve/checkers/KotlinVersionStringAnnotationValueChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/InfixModifierChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/InlineParameterChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/UnderscoreChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/ConstModifierChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/DataClassDeclarationChecker +instanceKlass org/jetbrains/kotlin/resolve/PlatformConfiguratorBaseKt +instanceKlass org/jetbrains/kotlin/container/ComponentRegistry +instanceKlass org/jetbrains/kotlin/container/ComponentStorage +instanceKlass org/jetbrains/kotlin/container/ValueResolver +instanceKlass org/jetbrains/kotlin/container/StorageComponentContainer +instanceKlass org/jetbrains/kotlin/container/ComponentProvider +instanceKlass org/jetbrains/kotlin/container/ComponentContainer +instanceKlass org/jetbrains/kotlin/container/DslKt +instanceKlass org/jetbrains/kotlin/resolve/jvm/JvmDeclarationReturnTypeSanitizer +instanceKlass org/jetbrains/kotlin/resolve/DeclarationReturnTypeSanitizer +instanceKlass org/jetbrains/kotlin/resolve/jvm/JvmOverridesBackwardCompatibilityHelper +instanceKlass org/jetbrains/kotlin/resolve/OverridesBackwardCompatibilityHelper +instanceKlass org/jetbrains/kotlin/resolve/jvm/JvmDelegationFilter +instanceKlass org/jetbrains/kotlin/resolve/lazy/DelegationFilter +instanceKlass org/jetbrains/kotlin/resolve/jvm/JvmOverloadFilter +instanceKlass org/jetbrains/kotlin/resolve/OverloadFilter +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmSimpleNameBacktickChecker +instanceKlass org/jetbrains/kotlin/resolve/IdentifierChecker +instanceKlass org/jetbrains/kotlin/resolve/sam/SamConversionResolver$Empty +instanceKlass org/jetbrains/kotlin/container/PlatformExtensionsClashResolver +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/ExplicitMetadataChecker +instanceKlass org/jetbrains/kotlin/fileClasses/JvmFileClassUtil +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/FileClassAnnotationsChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/RepeatableAnnotationChecker +instanceKlass org/jetbrains/kotlin/resolve/AdditionalAnnotationChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/MissingBuiltInDeclarationChecker$ClassifierUsage +instanceKlass org/jetbrains/kotlin/resolve/checkers/BigFunctionTypeAvailabilityChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmArrayVariableInLoopAssignmentChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JavaTypeAccessibilityChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/platform/JavaGenericVarianceViolationTypeChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/RuntimeAssertionsTypeChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/AdditionalTypeChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/PolymorphicSignatureCallChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/InconsistentOperatorFromJavaCallChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/ApiVersionIsAtLeastArgumentsChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/RuntimeAssertionsOnExtensionReceiverCallChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/ProtectedSyntheticExtensionCallChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/SuperCallWithDefaultArgumentsChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/UnsupportedSyntheticCallableReferenceChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/ProtectedInSuperClassCompanionCallChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JavaClassOnCompanionChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/SuspensionPointInsideMutexLockChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JavaAnnotationCallChecker$Companion +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JavaAnnotationCallChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/MissingBuiltInDeclarationChecker +instanceKlass org/jetbrains/kotlin/resolve/calls/checkers/CallChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/ClassInheritsJavaSealedClassChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/FunctionDelegateMemberNameClashChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/DefaultCheckerInTailrec +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/SynchronizedOnInlineMethodChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmMultifileClassStateChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/BadInheritedJavaSignaturesChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/SuspendInFunInterfaceChecker +instanceKlass org/jetbrains/kotlin/util/capitalizeDecapitalize/CapitalizeDecapitalizeKt +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmAnnotationsTargetNonExistentAccessorChecker$Companion +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmAnnotationsTargetNonExistentAccessorChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/StrictfpApplicabilityChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmInlineApplicabilityChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmSyntheticApplicabilityChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/TypeParameterBoundIsNotArrayChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmFieldApplicabilityChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/OverloadsAnnotationChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/ExternalFunChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/LocalFunInlineChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/SynchronizedAnnotationChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/VolatileAnnotationChecker +instanceKlass org/jetbrains/kotlin/resolve/jvm/checkers/JvmNameAnnotationChecker +instanceKlass org/jetbrains/kotlin/resolve/checkers/DeclarationChecker +instanceKlass org/jetbrains/kotlin/resolve/PlatformConfiguratorBase +instanceKlass org/jetbrains/kotlin/resolve/PlatformConfigurator +instanceKlass org/jetbrains/kotlin/resolve/ImportPath$Companion +instanceKlass org/jetbrains/kotlin/resolve/ImportPath +instanceKlass org/jetbrains/kotlin/resolve/PlatformDependentAnalyzerServices +instanceKlass org/jetbrains/kotlin/resolve/SealedClassInheritorsProvider +instanceKlass org/jetbrains/kotlin/resolve/ModuleAnnotationsResolver$Companion +instanceKlass kotlin/jvm/internal/TypeIntrinsics +instanceKlass org/jetbrains/kotlin/load/kotlin/JvmPackagePartProviderBase$ModuleMappingInfo +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/ModuleMappingKt +instanceKlass org/jetbrains/kotlin/protobuf/UnmodifiableLazyStringList$2 +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/PackageParts +instanceKlass org/jetbrains/kotlin/metadata/jvm/JvmModuleProtoBuf$PackagePartsOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/jvm/JvmModuleProtoBuf$ModuleOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/deserialization/VersionSpecificBehaviorKt +instanceKlass org/jetbrains/kotlin/load/kotlin/ModuleMappingUtilKt +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/BinaryModuleData +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMetadataVersion$Companion +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/ModuleMapping$Companion +instanceKlass org/jetbrains/kotlin/metadata/jvm/deserialization/ModuleMapping +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/JvmPackagePartProviderKt +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/GlobalSearchScope$UnionScope$$Lambda$145 +instanceKlass org/jetbrains/kotlin/config/KotlinCompilerVersion +instanceKlass org/jetbrains/kotlin/config/LanguageVersionSettingsKt +instanceKlass org/jetbrains/kotlin/resolve/CompilerDeserializationConfiguration +instanceKlass org/jetbrains/kotlin/load/kotlin/JvmPackagePartProviderBase$Companion +instanceKlass org/jetbrains/kotlin/load/kotlin/JvmPackagePartProviderBase +instanceKlass org/jetbrains/kotlin/serialization/deserialization/MetadataPartProvider +instanceKlass org/jetbrains/kotlin/load/kotlin/PackagePartProvider +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/FileBasedDeclarationProviderFactory$$Lambda$144 +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/FileBasedDeclarationProviderFactory$Index +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/AbstractDeclarationProviderFactory$$Lambda$143 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/ClassMemberDeclarationProvider +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/PackageMemberDeclarationProvider +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProvider +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/AbstractDeclarationProviderFactory +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProviderFactory +instanceKlass org/jetbrains/kotlin/frontend/java/di/InjectionKt +instanceKlass org/jetbrains/kotlin/descriptors/impl/ModuleDependenciesImpl +instanceKlass org/jetbrains/kotlin/descriptors/impl/ModuleDependencies +instanceKlass org/jetbrains/kotlin/protobuf/SmallSortedMap$EntryIterator +instanceKlass org/jetbrains/kotlin/protobuf/GeneratedMessageLite$ExtendableMessage$ExtensionWriter +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope$OptimizedImplementation +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope$Implementation +instanceKlass org/jetbrains/kotlin/serialization/deserialization/DeserializationConfiguration$DefaultImpls +instanceKlass org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer +instanceKlass org/jetbrains/kotlin/serialization/deserialization/TypeDeserializer +instanceKlass org/jetbrains/kotlin/serialization/deserialization/DeserializationContext +instanceKlass org/jetbrains/kotlin/metadata/deserialization/VersionRequirementTable$Companion +instanceKlass org/jetbrains/kotlin/metadata/deserialization/VersionRequirementTable +instanceKlass org/jetbrains/kotlin/metadata/deserialization/TypeTable +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer$Companion +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer +instanceKlass org/jetbrains/kotlin/descriptors/deserialization/PlatformDependentTypeTransformer$None +instanceKlass org/jetbrains/kotlin/descriptors/deserialization/PlatformDependentTypeTransformer +instanceKlass org/jetbrains/kotlin/resolve/OverridingUtil$1 +instanceKlass org/jetbrains/kotlin/load/java/JavaIncompatibilityRulesOverridabilityCondition$Companion +instanceKlass org/jetbrains/kotlin/load/java/JavaIncompatibilityRulesOverridabilityCondition +instanceKlass org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition +instanceKlass org/jetbrains/kotlin/load/java/FieldOverridabilityCondition +instanceKlass org/jetbrains/kotlin/resolve/ExternalOverridabilityCondition +instanceKlass org/jetbrains/kotlin/types/checker/KotlinTypeChecker$TypeConstructorEquality +instanceKlass org/jetbrains/kotlin/resolve/OverridingUtil +instanceKlass org/jetbrains/kotlin/types/checker/NewKotlinTypeCheckerImpl +instanceKlass org/jetbrains/kotlin/types/checker/NewKotlinTypeChecker$Companion +instanceKlass org/jetbrains/kotlin/types/checker/NewKotlinTypeChecker +instanceKlass org/jetbrains/kotlin/types/checker/KotlinTypeChecker +instanceKlass org/jetbrains/kotlin/resolve/sam/SamConversionResolverImpl +instanceKlass org/jetbrains/kotlin/resolve/sam/SamConversionResolver +instanceKlass org/jetbrains/kotlin/container/PlatformSpecificExtension +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ContractDeserializer$Companion$DEFAULT$1 +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ContractDeserializer$Companion +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ContractDeserializer +instanceKlass org/jetbrains/kotlin/serialization/deserialization/FlexibleTypeDeserializer$ThrowException +instanceKlass org/jetbrains/kotlin/serialization/deserialization/FlexibleTypeDeserializer +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ErrorReporter$1 +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ErrorReporter +instanceKlass org/jetbrains/kotlin/serialization/deserialization/LocalClassifierTypeSettings$Default +instanceKlass org/jetbrains/kotlin/serialization/deserialization/LocalClassifierTypeSettings +instanceKlass org/jetbrains/kotlin/resolve/constants/ConstantValue +instanceKlass org/jetbrains/kotlin/serialization/deserialization/AnnotationDeserializer +instanceKlass org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoaderImpl +instanceKlass org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoader +instanceKlass org/jetbrains/kotlin/serialization/deserialization/DeserializedClassDataFinder +instanceKlass org/jetbrains/kotlin/serialization/deserialization/DeserializationConfiguration$Default +instanceKlass org/jetbrains/kotlin/serialization/deserialization/DeserializationConfiguration +instanceKlass org/jetbrains/kotlin/serialization/deserialization/DeserializationComponents +instanceKlass org/jetbrains/kotlin/descriptors/NotFoundClasses +instanceKlass org/jetbrains/kotlin/descriptors/PackageFragmentProviderImpl +instanceKlass org/jetbrains/kotlin/descriptors/PackageFragmentProviderOptimized +instanceKlass org/jetbrains/kotlin/descriptors/PackageFragmentProvider +instanceKlass org/jetbrains/kotlin/metadata/deserialization/NameResolverImpl$WhenMappings +instanceKlass org/jetbrains/kotlin/protobuf/Utf8 +instanceKlass org/jetbrains/kotlin/serialization/deserialization/NameResolverUtilKt +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ProtoBasedClassDataFinder +instanceKlass org/jetbrains/kotlin/serialization/deserialization/ClassDataFinder +instanceKlass org/jetbrains/kotlin/metadata/deserialization/NameResolverImpl +instanceKlass org/jetbrains/kotlin/metadata/deserialization/NameResolver +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Type$Argument$Projection$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Type$ArgumentOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Annotation$ArgumentOrBuilder +instanceKlass org/jetbrains/kotlin/protobuf/SmallSortedMap$Entry +instanceKlass org/jetbrains/kotlin/protobuf/FieldSet$1 +instanceKlass org/jetbrains/kotlin/protobuf/AbstractMessageLite$Builder +instanceKlass org/jetbrains/kotlin/protobuf/GeneratedMessageLite$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$QualifiedNameTable$QualifiedName$Kind$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$QualifiedNameTable$QualifiedNameOrBuilder +instanceKlass org/jetbrains/kotlin/protobuf/WireFormat +instanceKlass org/jetbrains/kotlin/protobuf/CodedOutputStream +instanceKlass org/jetbrains/kotlin/protobuf/CodedInputStream +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$QualifiedNameTableOrBuilder +instanceKlass org/jetbrains/kotlin/protobuf/LazyStringList +instanceKlass org/jetbrains/kotlin/protobuf/ProtocolStringList +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$StringTableOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$PackageFragmentOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/builtins/BuiltInsBinaryVersion$Companion +instanceKlass org/jetbrains/kotlin/metadata/deserialization/BinaryVersion$Companion +instanceKlass org/jetbrains/kotlin/metadata/deserialization/BinaryVersion +instanceKlass org/jetbrains/kotlin/serialization/deserialization/builtins/BuiltInsPackageFragmentImpl$Companion +instanceKlass org/jetbrains/kotlin/builtins/BuiltInsPackageFragment +instanceKlass org/jetbrains/kotlin/protobuf/ExtensionRegistryLite$ObjectIntPair +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$TypeParameter$Variance$1 +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$TypeParameterOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$EnumEntryOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Annotation$Argument$Value$Type$1 +instanceKlass org/jetbrains/kotlin/protobuf/Internal$EnumLiteMap +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Annotation$Argument$ValueOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$ValueParameterOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$PropertyOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$ContractOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$FunctionOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$ConstructorOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$AnnotationOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$TypeOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$ClassOrBuilder +instanceKlass org/jetbrains/kotlin/protobuf/Internal$EnumLite +instanceKlass org/jetbrains/kotlin/protobuf/GeneratedMessageLite$ExtensionDescriptor +instanceKlass org/jetbrains/kotlin/protobuf/GeneratedMessageLite$GeneratedExtension +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$VersionRequirementTableOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$TypeTableOrBuilder +instanceKlass org/jetbrains/kotlin/protobuf/ByteString$ByteIterator +instanceKlass org/jetbrains/kotlin/protobuf/ByteString +instanceKlass org/jetbrains/kotlin/protobuf/SmallSortedMap$EmptySet$2 +instanceKlass org/jetbrains/kotlin/protobuf/SmallSortedMap$EmptySet$1 +instanceKlass org/jetbrains/kotlin/protobuf/SmallSortedMap$EmptySet +instanceKlass org/jetbrains/kotlin/protobuf/LazyFieldLite +instanceKlass org/jetbrains/kotlin/protobuf/FieldSet +instanceKlass org/jetbrains/kotlin/protobuf/AbstractParser +instanceKlass org/jetbrains/kotlin/protobuf/MessageLite$Builder +instanceKlass org/jetbrains/kotlin/protobuf/Parser +instanceKlass org/jetbrains/kotlin/protobuf/FieldSet$FieldDescriptorLite +instanceKlass org/jetbrains/kotlin/protobuf/AbstractMessageLite +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$PackageOrBuilder +instanceKlass org/jetbrains/kotlin/protobuf/GeneratedMessageLite$ExtendableMessageOrBuilder +instanceKlass org/jetbrains/kotlin/protobuf/MessageLite +instanceKlass org/jetbrains/kotlin/protobuf/MessageLiteOrBuilder +instanceKlass org/jetbrains/kotlin/metadata/builtins/BuiltInsProtoBuf +instanceKlass org/jetbrains/kotlin/protobuf/ExtensionRegistryLite +instanceKlass org/jetbrains/kotlin/serialization/SerializerExtensionProtocol +instanceKlass org/jetbrains/kotlin/utils/WrappedValues$ThrowableWrapper +instanceKlass org/jetbrains/kotlin/utils/WrappedValues$1 +instanceKlass org/jetbrains/kotlin/utils/WrappedValues +instanceKlass org/jetbrains/kotlin/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction$1 +instanceKlass org/jetbrains/kotlin/types/KotlinTypeFactory +instanceKlass org/jetbrains/kotlin/descriptors/FieldDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/PropertySetterDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/PropertyGetterDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/PropertyAccessorDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/VariableAccessorDescriptor +instanceKlass org/jetbrains/kotlin/types/ErrorUtils$2 +instanceKlass org/jetbrains/kotlin/types/ErrorUtils$ErrorScope +instanceKlass org/jetbrains/kotlin/cli/common/ModuleVisibilityHelperImpl +instanceKlass org/jetbrains/kotlin/descriptors/DescriptorVisibilities$12 +instanceKlass org/jetbrains/kotlin/descriptors/DescriptorVisibilities$11 +instanceKlass org/jetbrains/kotlin/descriptors/DescriptorVisibilities$10 +instanceKlass org/jetbrains/kotlin/util/ModuleVisibilityHelper +instanceKlass org/jetbrains/kotlin/descriptors/DescriptorVisibility +instanceKlass org/jetbrains/kotlin/descriptors/Visibility +instanceKlass org/jetbrains/kotlin/descriptors/DescriptorVisibilities +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/ReceiverValue +instanceKlass org/jetbrains/kotlin/resolve/scopes/receivers/Receiver +instanceKlass org/jetbrains/kotlin/descriptors/FunctionDescriptor$CopyBuilder +instanceKlass org/jetbrains/kotlin/descriptors/CallableMemberDescriptor$CopyBuilder +instanceKlass org/jetbrains/kotlin/descriptors/ClassConstructorDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/ConstructorDescriptor +instanceKlass org/jetbrains/kotlin/types/ErrorUtils$1 +instanceKlass org/jetbrains/kotlin/descriptors/SimpleFunctionDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/PropertyDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/VariableDescriptorWithAccessors +instanceKlass org/jetbrains/kotlin/descriptors/VariableDescriptor +instanceKlass org/jetbrains/kotlin/types/ErrorUtils +instanceKlass org/jetbrains/kotlin/types/TypeProjection +instanceKlass org/jetbrains/kotlin/types/model/TypeArgumentMarker +instanceKlass org/jetbrains/kotlin/types/TypeUtils +instanceKlass org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor$1$1 +instanceKlass org/jetbrains/kotlin/types/checker/KotlinTypeRefiner +instanceKlass org/jetbrains/kotlin/resolve/descriptorUtil/DescriptorUtilsKt +instanceKlass org/jetbrains/kotlin/descriptors/PackageViewDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/FunctionDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/CallableMemberDescriptor +instanceKlass org/jetbrains/kotlin/resolve/DescriptorUtils +instanceKlass org/jetbrains/kotlin/resolve/scopes/MemberScopeImpl +instanceKlass org/jetbrains/kotlin/descriptors/SupertypeLoopChecker +instanceKlass org/jetbrains/kotlin/types/AbstractTypeConstructor +instanceKlass org/jetbrains/kotlin/descriptors/ReceiverParameterDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/ParameterDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/ValueDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/CallableDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor$3 +instanceKlass org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor$2 +instanceKlass org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor$1 +instanceKlass org/jetbrains/kotlin/descriptors/Modality$Companion +instanceKlass org/jetbrains/kotlin/descriptors/impl/ModuleAwareClassDescriptor$Companion +instanceKlass org/jetbrains/kotlin/types/TypeConstructor +instanceKlass org/jetbrains/kotlin/types/model/TypeConstructorMarker +instanceKlass org/jetbrains/kotlin/resolve/scopes/MemberScope +instanceKlass org/jetbrains/kotlin/resolve/scopes/ResolutionScope +instanceKlass org/jetbrains/kotlin/descriptors/impl/ModuleAwareClassDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/ClassDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/ClassifierDescriptorWithTypeParameters +instanceKlass org/jetbrains/kotlin/descriptors/Substitutable +instanceKlass org/jetbrains/kotlin/descriptors/MemberDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/DeclarationDescriptorWithVisibility +instanceKlass org/jetbrains/kotlin/descriptors/SourceElement$1 +instanceKlass org/jetbrains/kotlin/descriptors/SourceElement +instanceKlass org/jetbrains/kotlin/descriptors/PackageFragmentDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/ClassOrPackageFragmentDescriptor +instanceKlass org/jetbrains/kotlin/builtins/jvm/JavaToKotlinClassMapper +instanceKlass org/jetbrains/kotlin/builtins/PlatformToKotlinClassMapper +instanceKlass org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsCustomizer +instanceKlass org/jetbrains/kotlin/storage/StorageKt +instanceKlass org/jetbrains/kotlin/utils/CollectionsKt +instanceKlass org/jetbrains/kotlin/builtins/PrimitiveType$Companion +instanceKlass org/jetbrains/kotlin/name/ClassId +instanceKlass org/jetbrains/kotlin/builtins/StandardNames$FqNames +instanceKlass org/jetbrains/kotlin/name/FqNameUnsafe$1 +instanceKlass org/jetbrains/kotlin/name/FqNameUnsafe +instanceKlass org/jetbrains/kotlin/name/FqName +instanceKlass org/jetbrains/kotlin/builtins/StandardNames +instanceKlass org/jetbrains/kotlin/builtins/jvm/JvmBuiltInClassDescriptorFactory$Companion +instanceKlass org/jetbrains/kotlin/builtins/jvm/JvmBuiltInClassDescriptorFactory +instanceKlass org/jetbrains/kotlin/builtins/functions/BuiltInFictitiousFunctionClassFactory +instanceKlass org/jetbrains/kotlin/descriptors/deserialization/ClassDescriptorFactory +instanceKlass org/jetbrains/kotlin/serialization/deserialization/builtins/BuiltInsResourceLoader +instanceKlass org/jetbrains/kotlin/serialization/deserialization/builtins/BuiltInsLoaderImpl +instanceKlass org/jetbrains/kotlin/builtins/BuiltInsLoader$Companion +instanceKlass org/jetbrains/kotlin/builtins/BuiltInsLoader +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/TopDownAnalyzerFacadeForJVM$SourceOrBinaryModuleClassResolver +instanceKlass org/jetbrains/kotlin/load/java/lazy/ModuleClassResolver +instanceKlass org/jetbrains/kotlin/modules/TargetId +instanceKlass org/jetbrains/kotlin/modules/TargetIdKt +instanceKlass org/jetbrains/kotlin/incremental/components/ExpectActualTracker$DoNothing +instanceKlass org/jetbrains/kotlin/incremental/components/ExpectActualTracker +instanceKlass org/jetbrains/kotlin/incremental/components/LookupTracker$DO_NOTHING +instanceKlass org/jetbrains/kotlin/incremental/components/LookupTracker +instanceKlass org/jetbrains/kotlin/builtins/KotlinBuiltIns$4 +instanceKlass org/jetbrains/kotlin/context/MutableModuleContextImpl +instanceKlass org/jetbrains/kotlin/context/MutableModuleContext +instanceKlass org/jetbrains/kotlin/context/ModuleContext +instanceKlass org/jetbrains/kotlin/types/checker/Ref +instanceKlass org/jetbrains/kotlin/descriptors/ModuleCapability +instanceKlass org/jetbrains/kotlin/types/checker/KotlinTypeRefinerKt +instanceKlass org/jetbrains/kotlin/descriptors/annotations/Annotations$Companion$EMPTY$1 +instanceKlass org/jetbrains/kotlin/descriptors/annotations/Annotations$Companion +instanceKlass org/jetbrains/kotlin/descriptors/annotations/Annotations +instanceKlass org/jetbrains/kotlin/descriptors/annotations/AnnotatedImpl +instanceKlass org/jetbrains/kotlin/builtins/jvm/JvmBuiltIns$WhenMappings +instanceKlass org/jetbrains/kotlin/builtins/KotlinBuiltIns$3 +instanceKlass org/jetbrains/kotlin/builtins/KotlinBuiltIns$2 +instanceKlass org/jetbrains/kotlin/storage/LockBasedStorageManager$LockBasedLazyValue +instanceKlass org/jetbrains/kotlin/builtins/KotlinBuiltIns$1 +instanceKlass org/jetbrains/kotlin/types/model/TypeArgumentListMarker +instanceKlass org/jetbrains/kotlin/types/model/SimpleTypeMarker +instanceKlass org/jetbrains/kotlin/types/KotlinType +instanceKlass org/jetbrains/kotlin/types/model/KotlinTypeMarker +instanceKlass org/jetbrains/kotlin/descriptors/deserialization/AdditionalClassPartsProvider +instanceKlass org/jetbrains/kotlin/descriptors/ModuleDescriptor +instanceKlass org/jetbrains/kotlin/incremental/components/LookupLocation +instanceKlass org/jetbrains/kotlin/descriptors/deserialization/PlatformDependentDeclarationFilter +instanceKlass org/jetbrains/kotlin/descriptors/ClassifierDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/DeclarationDescriptorNonRoot +instanceKlass org/jetbrains/kotlin/descriptors/DeclarationDescriptorWithSource +instanceKlass org/jetbrains/kotlin/descriptors/DeclarationDescriptor +instanceKlass org/jetbrains/kotlin/descriptors/annotations/Annotated +instanceKlass org/jetbrains/kotlin/descriptors/Named +instanceKlass org/jetbrains/kotlin/builtins/KotlinBuiltIns +instanceKlass org/jetbrains/kotlin/storage/DefaultSimpleLock +instanceKlass org/jetbrains/kotlin/storage/SimpleLock$Companion +instanceKlass org/jetbrains/kotlin/context/ContextKt$$Lambda$142 +instanceKlass org/jetbrains/kotlin/context/SimpleGlobalContext +instanceKlass org/jetbrains/kotlin/storage/ExceptionTracker +instanceKlass org/jetbrains/kotlin/context/ProjectContextImpl +instanceKlass org/jetbrains/kotlin/context/ProjectContext +instanceKlass org/jetbrains/kotlin/context/GlobalContext +instanceKlass org/jetbrains/kotlin/context/ContextKt +instanceKlass org/jetbrains/kotlin/platform/TargetPlatform +instanceKlass org/jetbrains/kotlin/platform/TargetPlatformKt +instanceKlass org/jetbrains/kotlin/platform/TargetPlatformVersion$NoVersion +instanceKlass org/jetbrains/kotlin/platform/SimplePlatform +instanceKlass org/jetbrains/kotlin/platform/jvm/JvmPlatforms +instanceKlass org/jetbrains/kotlin/resolve/TargetEnvironment +instanceKlass org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression$$Lambda$141 +instanceKlass org/jetbrains/kotlin/resolve/diagnostics/Diagnostics$Companion$EMPTY$1 +instanceKlass org/jetbrains/kotlin/resolve/diagnostics/Diagnostics$Companion +instanceKlass org/jetbrains/kotlin/resolve/diagnostics/DiagnosticSuppressor$Companion +instanceKlass org/jetbrains/kotlin/resolve/diagnostics/DiagnosticSuppressor +instanceKlass org/jetbrains/kotlin/util/ExtensionProvider$Companion +instanceKlass org/jetbrains/kotlin/util/MappedExtensionProvider +instanceKlass org/jetbrains/kotlin/resolve/diagnostics/KotlinSuppressCache$Companion +instanceKlass org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression +instanceKlass org/jetbrains/kotlin/resolve/diagnostics/Diagnostics +instanceKlass org/jetbrains/kotlin/diagnostics/GenericDiagnostics +instanceKlass org/jetbrains/kotlin/util/slicedMap/WritableSlice +instanceKlass org/jetbrains/kotlin/resolve/BindingTraceContext$1 +instanceKlass org/jetbrains/kotlin/resolve/CleanableBindingContext +instanceKlass org/jetbrains/kotlin/util/slicedMap/SlicedMapImpl +instanceKlass org/jetbrains/kotlin/resolve/BindingTraceFilter$Companion +instanceKlass org/jetbrains/kotlin/resolve/BindingTraceFilter +instanceKlass org/jetbrains/kotlin/diagnostics/DiagnosticSink$2 +instanceKlass org/jetbrains/kotlin/diagnostics/DiagnosticSink$1 +instanceKlass org/jetbrains/kotlin/util/slicedMap/ReadOnlySlice +instanceKlass org/jetbrains/kotlin/util/slicedMap/MutableSlicedMap +instanceKlass org/jetbrains/kotlin/util/slicedMap/SlicedMap +instanceKlass org/jetbrains/kotlin/resolve/diagnostics/KotlinSuppressCache +instanceKlass org/jetbrains/kotlin/resolve/BindingContext +instanceKlass org/jetbrains/kotlin/resolve/BindingTraceContext +instanceKlass org/jetbrains/kotlin/resolve/BindingTrace +instanceKlass org/jetbrains/kotlin/diagnostics/DiagnosticSink +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ContainerUtil$12 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/CompactVirtualFileSet$$Lambda$140 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/SequenceIterator +instanceKlass org/jetbrains/kotlin/com/intellij/util/UnmodifiableIterator +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VirtualFileWithId +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/TopDownAnalyzerFacadeForJVM +instanceKlass org/jetbrains/kotlin/com/intellij/lang/PsiParser +instanceKlass org/jetbrains/kotlin/kdoc/lexer/KDocTokens +instanceKlass org/jetbrains/kotlin/lexer/KtTokens +instanceKlass org/jetbrains/kotlin/diagnostics/PositioningStrategy +instanceKlass org/jetbrains/kotlin/diagnostics/PositioningStrategies +instanceKlass org/jetbrains/kotlin/diagnostics/DiagnosticFactory$Companion +instanceKlass org/jetbrains/kotlin/diagnostics/UnboundDiagnostic +instanceKlass org/jetbrains/kotlin/diagnostics/DiagnosticFactory +instanceKlass org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport$Companion +instanceKlass org/jetbrains/kotlin/cli/common/messages/AnalyzerWithCompilerReport +instanceKlass org/jetbrains/kotlin/analyzer/AbstractAnalyzerWithCompilerReport +instanceKlass org/jetbrains/kotlin/load/kotlin/ModuleVisibilityManager$SERVICE +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/StringFactory +instanceKlass org/jetbrains/kotlin/com/intellij/injected/editor/DocumentWindow +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/impl/FrozenDocument +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Node +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/impl/DocumentImpl$1 +instanceKlass java/beans/PropertyChangeListener +instanceKlass java/beans/ChangeListenerMap +instanceKlass java/beans/PropertyChangeSupport +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/impl/IntervalTreeImpl$IntervalTreeGuide +instanceKlass org/jetbrains/kotlin/com/intellij/util/WalkingState$TreeGuide +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/impl/RedBlackTree$Node +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/ex/PrioritizedDocumentListener$1 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/ex/PrioritizedDocumentListener +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/impl/LockFreeCOWSortedArray +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/ex/DocumentEx$1 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/fileEditor/impl/LoadTextUtil$ConvertResult +instanceKlass sun/nio/cs/ThreadLocalCoders$Cache +instanceKlass sun/nio/cs/ThreadLocalCoders +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/fileEditor/impl/LoadTextUtil$DetectResult +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/fileEditor/impl/LoadTextUtil +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/JavaLanguageLevelKt +instanceKlass org/jetbrains/kotlin/config/AppendJavaSourceRootsHandlerKeyKt +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinderFactory +instanceKlass org/jetbrains/kotlin/load/kotlin/VirtualFileFinderFactory +instanceKlass org/jetbrains/kotlin/load/kotlin/MetadataFinderFactory +instanceKlass org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleResolver +instanceKlass org/jetbrains/kotlin/resolve/jvm/modules/JavaModuleResolver +instanceKlass org/jetbrains/kotlin/cli/jvm/index/SingleJavaFileRootsIndex +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesDynamicCompoundIndex +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndex +instanceKlass org/jetbrains/kotlin/cli/jvm/JvmRuntimeVersionsConsistencyChecker$ClasspathConsistency +instanceKlass org/jetbrains/kotlin/cli/jvm/JvmRuntimeVersionsConsistencyChecker$RuntimeJarsInfo +instanceKlass org/jetbrains/kotlin/cli/jvm/JvmRuntimeVersionsConsistencyChecker$KotlinLibraryFile +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VirtualFileVisitor +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VfsUtilCore +instanceKlass org/jetbrains/kotlin/cli/jvm/JvmRuntimeVersionsConsistencyChecker$FileKind +instanceKlass org/jetbrains/kotlin/cli/jvm/JvmRuntimeVersionsConsistencyChecker +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver$RootsAndModules +instanceKlass kotlin/sequences/FlatteningSequence$iterator$1 +instanceKlass kotlin/sequences/FlatteningSequence +instanceKlass kotlin/collections/ArraysKt___ArraysKt$asSequence$$inlined$Sequence$1 +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JavaRoot$RootTypes +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JavaRoot +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver$RootWithPrefix +instanceKlass org/jetbrains/kotlin/cli/jvm/config/JvmModulePathRoot +instanceKlass java/util/AbstractMap$SimpleEntry +instanceKlass gnu/trove/THashMap$Entry +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/FactoryMap$$Lambda$139 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/FactoryMap +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/impl/jar/CoreJarHandler$$Lambda$138 +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/ByteArrayCharSequence +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/CharArrayExternalizable +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableCharSequence +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Trinity +instanceKlass java/util/zip/ZipFile$$Lambda$137 +instanceKlass java/util/zip/ZipFile$ZipEntryIterator +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/impl/ArchiveHandler$EntryInfo +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ShareableKey +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileAttributes +instanceKlass java/nio/file/attribute/BasicWithKeyFileAttributeView +instanceKlass java/nio/file/attribute/DosFileAttributeView +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileSystemUtil$Nio2MediatorImpl +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileSystemUtil$Mediator +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileSystemUtil +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/hash/LinkedHashMap$Entry +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/hash/HashUtil +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/SLRUMap +instanceKlass org/jetbrains/kotlin/com/intellij/util/SystemProperties +instanceKlass org/jetbrains/kotlin/com/intellij/util/io/ResourceHandle +instanceKlass org/jetbrains/kotlin/com/intellij/util/io/FileAccessorCache +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/hash/EqualityPolicy +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/impl/AddonlyKeylessHash$KeyValueMapper +instanceKlass org/jetbrains/kotlin/storage/LockBasedStorageManager$MapBasedMemoizedFunction +instanceKlass org/jetbrains/kotlin/storage/EmptySimpleLock +instanceKlass org/jetbrains/kotlin/storage/LockBasedStorageManager$ExceptionHandlingStrategy$1 +instanceKlass org/jetbrains/kotlin/storage/LockBasedStorageManager$ExceptionHandlingStrategy +instanceKlass org/jetbrains/kotlin/storage/CacheWithNullableValues +instanceKlass org/jetbrains/kotlin/storage/CacheWithNotNullValues +instanceKlass org/jetbrains/kotlin/storage/MemoizedFunctionToNotNull +instanceKlass org/jetbrains/kotlin/storage/NotNullLazyValue +instanceKlass org/jetbrains/kotlin/storage/MemoizedFunctionToNullable +instanceKlass org/jetbrains/kotlin/storage/NullableLazyValue +instanceKlass org/jetbrains/kotlin/storage/SimpleLock +instanceKlass org/jetbrains/kotlin/storage/LockBasedStorageManager +instanceKlass org/jetbrains/kotlin/storage/StorageManager +instanceKlass org/jetbrains/kotlin/cli/jvm/modules/JavaModuleGraph +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver$Companion +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/ClasspathRootsResolver +instanceKlass org/jetbrains/kotlin/cli/jvm/modules/CliJavaModuleFinder +instanceKlass org/jetbrains/kotlin/resolve/jvm/modules/JavaModuleFinder +instanceKlass kotlin/comparisons/ComparisonsKt__ComparisonsKt +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileUtil$2 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileUtil$1 +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/CharSequenceHashingStrategy +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/CaseInsensitiveStringHashingStrategy +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/FilePathHashingStrategy +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileUtilRt$SymlinkResolver +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment$special$$inlined$sortBy$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/PsiUtilCore$NullPsiElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/PsiUtilCore +instanceKlass org/jetbrains/kotlin/com/intellij/psi/TokenType +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinScriptStub +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinPlaceHolderWithTextStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/LiteralTextEscaper +instanceKlass org/jetbrains/kotlin/com/intellij/psi/ContributedReferenceHost +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinConstantExpressionStub +instanceKlass org/jetbrains/kotlin/psi/stubs/elements/KtConstantExpressionElementType$Companion +instanceKlass org/jetbrains/kotlin/psi/LambdaArgument +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinContractEffectStub +instanceKlass org/jetbrains/kotlin/psi/ValueArgumentName +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinValueArgumentStub +instanceKlass org/jetbrains/kotlin/psi/ValueArgument +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinEnumEntrySuperclassReferenceExpressionStub +instanceKlass org/jetbrains/kotlin/psi/KtQualifiedExpression +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinNameReferenceExpressionStub +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinTypeProjectionStub +instanceKlass org/jetbrains/kotlin/psi/KtSimpleNameExpression +instanceKlass org/jetbrains/kotlin/psi/KtReferenceExpression +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinUserTypeStub +instanceKlass org/jetbrains/kotlin/psi/KtTypeElement +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinModifierListStub +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinImportAliasStub +instanceKlass org/jetbrains/kotlin/psi/KtImportInfo$ImportContent +instanceKlass org/jetbrains/kotlin/psi/KtImportInfo +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinImportDirectiveStub +instanceKlass org/jetbrains/kotlin/psi/KtAnnotationsContainer +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinAnnotationUseSiteTargetStub +instanceKlass org/jetbrains/kotlin/psi/KtCallElement +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinAnnotationEntryStub +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinTypeParameterStub +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinParameterStub +instanceKlass org/jetbrains/kotlin/psi/KtAnonymousInitializer +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinPlaceHolderStub +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinObjectStub +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinTypeAliasStub +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinPropertyAccessorStub +instanceKlass org/jetbrains/kotlin/psi/KtVariableDeclaration +instanceKlass org/jetbrains/kotlin/psi/KtValVarKeywordOwner +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinPropertyStub +instanceKlass org/jetbrains/kotlin/psi/KtFunction +instanceKlass org/jetbrains/kotlin/psi/KtDeclarationWithBody +instanceKlass org/jetbrains/kotlin/psi/KtCallableDeclaration +instanceKlass org/jetbrains/kotlin/psi/KtDeclarationWithInitializer +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinFunctionStub +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinCallableStubBase +instanceKlass org/jetbrains/kotlin/psi/stubs/elements/KtStubElementType$$Lambda$136 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/SubstrateRef +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinClassStub +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinClassOrObjectStub +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinStubWithFqName +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/NamedStub +instanceKlass org/jetbrains/kotlin/psi/KtTypeParameterListOwner +instanceKlass org/jetbrains/kotlin/psi/KtPureClassOrObject +instanceKlass org/jetbrains/kotlin/psi/KtNamedDeclaration +instanceKlass org/jetbrains/kotlin/psi/KtStatementExpression +instanceKlass org/jetbrains/kotlin/psi/KtNamed +instanceKlass org/jetbrains/kotlin/psi/KtDeclaration +instanceKlass org/jetbrains/kotlin/psi/KtExpression +instanceKlass org/jetbrains/kotlin/psi/stubs/elements/KtStubElementTypes +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +instanceKlass org/jetbrains/kotlin/psi/KtFile$Companion +instanceKlass java/util/Comparator$$Lambda$135 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiFileImpl$$Lambda$134 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/FileTrees +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/StubbedSpine +instanceKlass org/jetbrains/kotlin/com/intellij/util/ConcurrencyUtil$$Lambda$133 +instanceKlass java/util/function/UnaryOperator +instanceKlass org/jetbrains/kotlin/com/intellij/psi/AbstractFileViewProvider$VirtualFileContent +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiLock +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiLargeBinaryFile +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiLargeFile +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiBinaryFile +instanceKlass org/jetbrains/kotlin/com/intellij/psi/AbstractFileViewProvider$Content +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ContainerUtilRt +instanceKlass org/jetbrains/kotlin/com/intellij/util/pico/CachingConstructorInjectionComponentAdapter$$Lambda$132 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/components/Service +instanceKlass org/jetbrains/kotlin/com/intellij/model/ModelBranch +instanceKlass org/jetbrains/kotlin/com/intellij/injected/editor/VirtualFileWindow +instanceKlass kotlin/collections/AbstractIterator$WhenMappings +instanceKlass kotlin/io/FileTreeWalk$WalkState +instanceKlass kotlin/collections/AbstractIterator +instanceKlass kotlin/io/FileTreeWalk +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/local/CoreLocalVirtualFile$$Lambda$131 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/extensions/PreprocessedFileCreator +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/KeyedExtensionCollector$$Lambda$130 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/KeyedExtensionCollector$MyExtensionPointListener +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/ExtensionPointPriorityListener +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/CoreEnvironmentUtilsKt +instanceKlass org/jetbrains/kotlin/com/intellij/diagnostic/Activity +instanceKlass org/jetbrains/kotlin/com/intellij/diagnostic/StartUpMeasurer +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/CliModuleAnnotationsResolver +instanceKlass org/jetbrains/kotlin/resolve/ModuleAnnotationsResolver +instanceKlass org/jetbrains/kotlin/com/intellij/util/CachedValueBase$Data +instanceKlass org/jetbrains/kotlin/com/intellij/util/CachedValueBase +instanceKlass org/jetbrains/kotlin/asJava/classes/FacadeCache$$Lambda$129 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/CachedValueProvider$Result +instanceKlass org/jetbrains/kotlin/asJava/classes/FacadeCache$Companion +instanceKlass org/jetbrains/kotlin/asJava/classes/FacadeCache +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade$2 +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade$1 +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade$$Lambda$128 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiModifierList +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiElement$$Lambda$127 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/ElementBase$$Lambda$126 +instanceKlass sun/invoke/util/VerifyAccess$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/ElementBase$ElementIconRequest +instanceKlass javax/swing/Icon +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaClass +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaTypeParameterListOwner +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaModifierListOwner +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaClassifier +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaNamedElement +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaAnnotationOwner +instanceKlass org/jetbrains/kotlin/load/java/structure/JavaElement +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade$KotlinPsiElementFinderWrapperImpl +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade$KotlinPsiElementFinderWrapper +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade +instanceKlass org/jetbrains/kotlin/cli/common/CliModuleVisibilityManagerImpl +instanceKlass org/jetbrains/kotlin/load/kotlin/ModuleVisibilityManager +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProviderFactoryService$Companion +instanceKlass org/jetbrains/kotlin/resolve/lazy/declarations/DeclarationProviderFactoryService +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeDeclarationCheckerComponentContainerContributor +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeClinitClassBuilderInterceptorExtension +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeResolveExtension$Companion +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeResolveExtension +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeIrGeneratorExtension +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeCodegenExtension +instanceKlass org/jetbrains/kotlin/parcelize/serializers/ParcelizeExtensionBase +instanceKlass org/jetbrains/kotlin/kapt3/Kapt3ComponentRegistrar$KaptComponentContributor +instanceKlass org/jetbrains/kotlin/resolve/jvm/extensions/PartialAnalysisHandlerExtension +instanceKlass org/jetbrains/kotlin/base/kapt3/KaptFlags$Companion$fromSet$1 +instanceKlass org/jetbrains/kotlin/base/kapt3/KaptFlags$Companion +instanceKlass org/jetbrains/kotlin/base/kapt3/KaptOptions +instanceKlass org/jetbrains/kotlin/base/kapt3/KaptFlags +instanceKlass com/sun/tools/javac/util/Context +instanceKlass org/jetbrains/kotlin/kapt3/base/Kapt +instanceKlass org/jetbrains/kotlin/kapt3/util/MessageCollectorBackedKaptLogger$Companion +instanceKlass org/jetbrains/kotlin/kapt3/util/MessageCollectorBackedKaptLogger +instanceKlass org/jetbrains/kotlin/kapt3/base/util/KaptLogger +instanceKlass org/jetbrains/kotlin/serialization/DescriptorSerializerPlugin +instanceKlass org/jetbrains/kotlin/extensions/internal/CallResolutionInterceptorExtension +instanceKlass org/jetbrains/kotlin/extensions/internal/CandidateInterceptor +instanceKlass org/jetbrains/kotlin/extensions/internal/TypeResolutionInterceptorExtension +instanceKlass org/jetbrains/kotlin/extensions/internal/TypeResolutionInterceptor +instanceKlass org/jetbrains/kotlin/cli/common/extensions/ShellExtension +instanceKlass org/jetbrains/kotlin/cli/common/extensions/ScriptEvaluationExtension +instanceKlass org/jetbrains/kotlin/backend/common/extensions/IrGenerationExtension +instanceKlass org/jetbrains/kotlin/ir/linkage/IrDeserializer$IrLinkerExtension +instanceKlass org/jetbrains/kotlin/resolve/extensions/ExtraImportsProviderExtension +instanceKlass org/jetbrains/kotlin/extensions/CollectAdditionalSourcesExtension +instanceKlass org/jetbrains/kotlin/extensions/CompilerConfigurationExtension +instanceKlass org/jetbrains/kotlin/js/translate/extensions/JsSyntheticTranslateExtension +instanceKlass org/jetbrains/kotlin/extensions/PreprocessedVirtualFileFactoryExtension +instanceKlass org/jetbrains/kotlin/extensions/DeclarationAttributeAltererExtension +instanceKlass org/jetbrains/kotlin/extensions/StorageComponentContainerContributor +instanceKlass org/jetbrains/kotlin/resolve/jvm/extensions/PackageFragmentProviderExtension +instanceKlass org/jetbrains/kotlin/resolve/jvm/extensions/AnalysisHandlerExtension +instanceKlass org/jetbrains/kotlin/codegen/extensions/ClassBuilderInterceptorExtension +instanceKlass org/jetbrains/kotlin/resolve/extensions/SyntheticResolveExtension +instanceKlass org/jetbrains/kotlin/extensions/ProjectExtensionDescriptor +instanceKlass org/jetbrains/kotlin/codegen/extensions/ExpressionCodegenExtension +instanceKlass java/util/Random +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileUtilRt$2 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileUtilRt$1 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileUtilRt$RepeatableIOOperation +instanceKlass java/io/FileFilter +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileUtilRt +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/PersistentFSConstants +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/facade/JvmFacadeImpl$$Lambda$125 +instanceKlass org/jetbrains/kotlin/com/intellij/util/keyFMap/ArrayBackedFMap +instanceKlass org/jetbrains/kotlin/com/intellij/util/keyFMap/PairElementsFMap +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/DummyHolderFactory$DefaultFactory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/DummyHolderFactory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiImportHolder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/JavaDummyHolderFactory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/JavaPsiFacadeImpl$$Lambda$124 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/JavaPsiFacadeImpl$$Lambda$123 +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/facade/JvmFacadeImpl +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/facade/JvmFacade +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/HolderFactory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiConstantEvaluationHelper +instanceKlass org/jetbrains/kotlin/com/intellij/psi/JavaPsiFacade +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/MockInferredAnnotationsManager$Companion +instanceKlass org/jetbrains/kotlin/com/intellij/codeInsight/InferredAnnotationsManager +instanceKlass org/jetbrains/kotlin/com/intellij/codeInsight/ExternalAnnotationsListener +instanceKlass org/jetbrains/kotlin/com/intellij/codeInsight/ExternalAnnotationsManager +instanceKlass org/jetbrains/kotlin/com/intellij/util/Processor +instanceKlass org/jetbrains/kotlin/asJava/finder/JavaElementFinder$Companion +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinFinderMarker +instanceKlass org/jetbrains/kotlin/asJava/KotlinAsJavaSupport$Companion +instanceKlass org/jetbrains/kotlin/asJava/KotlinAsJavaSupport +instanceKlass org/jetbrains/kotlin/asJava/classes/ImplUtilsKt +instanceKlass org/jetbrains/kotlin/asJava/LightClassGenerationSupport$Companion +instanceKlass org/jetbrains/kotlin/asJava/LightClassGenerationSupport +instanceKlass org/jetbrains/kotlin/resolve/jvm/JvmCodeAnalyzerInitializer +instanceKlass org/jetbrains/kotlin/resolve/CodeAnalyzerInitializer +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/JvmPsiConversionHelperImpl +instanceKlass org/jetbrains/kotlin/com/intellij/psi/JvmPsiConversionHelper +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/Interner +instanceKlass org/jetbrains/kotlin/utils/PlatformUtilsKt +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryClassSignatureParser +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/ProjectScope$$Lambda$122 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/ProjectScope$$Lambda$121 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/ProjectScope$$Lambda$120 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/ProjectScope$$Lambda$119 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/ProjectScope$$Lambda$118 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/ProjectScope +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl$Companion +instanceKlass org/jetbrains/kotlin/com/intellij/core/CoreJavaFileManager +instanceKlass org/jetbrains/kotlin/resolve/jvm/KotlinCliJavaFileManager +instanceKlass org/jetbrains/kotlin/com/intellij/psi/controlFlow/ControlFlowFactory$$Lambda$117 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentWeakKeySoftValueHashMap$$Lambda$116 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentWeakKeySoftValueHashMap$HardKey +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentWeakKeySoftValueHashMap$KeyReference +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentWeakKeySoftValueHashMap +instanceKlass org/jetbrains/kotlin/com/intellij/psi/controlFlow/ControlFlow +instanceKlass org/jetbrains/kotlin/com/intellij/psi/controlFlow/ControlFlowFactory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/codeStyle/SuggestedNameInfo +instanceKlass org/jetbrains/kotlin/com/intellij/psi/codeStyle/JavaCodeStyleManager +instanceKlass org/jetbrains/kotlin/com/intellij/psi/codeStyle/JavaCodeStyleSettingsFacade +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/JavaResolveCache$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/JavaResolveCache +instanceKlass org/jetbrains/kotlin/com/intellij/BundleBase +instanceKlass java/util/ResourceBundle$Control$1 +instanceKlass java/util/ResourceBundle$$Lambda$115 +instanceKlass java/util/ResourceBundle$CacheKeyReference +instanceKlass java/util/ResourceBundle$CacheKey +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/RecursionManager$2 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/SoftKeySoftValueHashMap +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentRefValueHashMap$ValueReference +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentRefValueHashMap +instanceKlass org/jetbrains/kotlin/com/intellij/AbstractBundle$$Lambda$114 +instanceKlass org/jetbrains/kotlin/com/intellij/AbstractBundle +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/roots/LanguageLevelProjectExtension +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/RecursionManager$$Lambda$113 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/RecursionManager$CalculationStack +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/RecursionGuard$StackStamp +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/RecursionGuard +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/RecursionManager +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiInferenceHelper +instanceKlass org/jetbrains/kotlin/com/intellij/psi/scope/processor/FilterScopeProcessor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/scope/PsiScopeProcessor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/scope/NameHint +instanceKlass org/jetbrains/kotlin/com/intellij/psi/scope/ElementClassHint +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiResolveHelper +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/JavaPsiImplementationHelper +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiManagerImpl$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiElementFactoryImpl$$Lambda$112 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiElementFactoryImpl$$Lambda$111 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiType$$Lambda$110 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/TypeAnnotationProvider$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/TypeAnnotationProvider$Static +instanceKlass org/jetbrains/kotlin/com/intellij/psi/TypeAnnotationProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiAnnotation$$Lambda$109 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiAnnotation +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/types/JvmPrimitiveTypeKind +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmAnnotation +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$108 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$107 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$106 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$105 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$104 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$103 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$102 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$101 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$100 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$99 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$98 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$97 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$96 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl$$Lambda$95 +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/JavaParserUtil$ParserWrapper +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiImportStatementBase +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiTypeElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiReferenceExpression +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiExpression +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiAnnotationMemberValue +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiJavaCodeReferenceElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiQualifiedReferenceElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiQualifiedReference +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiJavaReference +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiPolyVariantReference +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/types/JvmReferenceType +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/types/JvmPrimitiveType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiAnnotationOwner +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/types/JvmType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiJavaParserFacadeImpl +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiElementFactory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiJavaParserFacade +instanceKlass org/jetbrains/kotlin/com/intellij/psi/JVMElementFactory +instanceKlass org/jetbrains/kotlin/com/intellij/lang/injection/InjectedLanguageManager +instanceKlass org/jetbrains/kotlin/com/intellij/mock/MockDumbUtil +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/project/DumbUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/SearchScope +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/ProjectAwareFileFilter +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiDirectory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/file/PsiDirectoryFactory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/CachedValue +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/ParameterizedCachedValue +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiCachedValuesFactory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/CachedValueProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/CachedValuesManager +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/tree/TreeElementVisitor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiFileFactory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiManagerImpl$$Lambda$94 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiTreeChangeAdapter +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/event/DocumentListener$$Lambda$93 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiRecursiveVisitor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiElementVisitor +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/ex/DocumentEx +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiTreeChangeListener +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/event/DocumentListener +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiDocumentManager +instanceKlass org/jetbrains/kotlin/com/intellij/core/MockDocumentCommitProcessor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/DocumentCommitProcessor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/SmartPointerManager +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/file/impl/FileManagerImpl$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/file/impl/FileManagerImpl$$Lambda$92 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/file/impl/FileManagerImpl$$Lambda$91 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Comparing +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/fileTypes/CharsetUtil +instanceKlass org/jetbrains/kotlin/com/intellij/util/LocalTimeCounter +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/NonPhysicalFileSystem +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/file/impl/FileManagerImpl +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/PsiModificationTracker$SERVICE +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiManagerImpl$$Lambda$90 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/NotNullFactory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Factory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VirtualFileFilter$2 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VirtualFileFilter$1 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VirtualFileFilter +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/LowMemoryWatcher$$Lambda$89 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/UnsafeWeakList$$Lambda$88 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/UnsafeWeakList$$Lambda$87 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/LowMemoryWatcher +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/ResolveCache$$Lambda$86 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/ResolveCache$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/AnyPsiChangeListener +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/wm/ex/ProgressIndicatorEx +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/file/impl/FileManager +instanceKlass java/util/concurrent/atomic/AtomicReferenceArray +instanceKlass org/jetbrains/kotlin/com/intellij/psi/ResolveResult +instanceKlass org/jetbrains/kotlin/com/intellij/model/SymbolResolveResult +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/ResolveCache$StrongValueReference +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentWeakKeySoftValueHashMap$ValueReference +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/ResolveCache$AbstractResolver +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiReference +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/ResolveCache +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiModificationTrackerImpl$1 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/components/ServiceManager$$Lambda$85 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/project/DumbService$DumbModeListener +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/project/DumbService +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/PsiModificationTracker$Listener +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentFactoryMap$$Lambda$84 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiModificationTrackerImpl$$Lambda$83 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiModificationTrackerImpl +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/PsiModificationTracker +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/facade/JvmElementProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiElementFinder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiTreeChangePreprocessor +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/roots/PackageIndex +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/file/impl/JavaFileManager +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/roots/FileIndexFacade +instanceKlass org/jetbrains/kotlin/com/intellij/psi/search/ProjectScopeBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/ResolveScopeManager +instanceKlass org/jetbrains/kotlin/com/intellij/util/CachedValuesFactory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/project/Project +instanceKlass org/jetbrains/kotlin/com/intellij/core/CoreProjectEnvironment +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment$Companion$getOrCreateApplicationEnvironment$1$2 +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment$Companion$getOrCreateApplicationEnvironment$1$1 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/TransactionGuard +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/JavaClassSupers +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinBinaryClassCache$Companion +instanceKlass org/jetbrains/kotlin/load/kotlin/KotlinBinaryClassCache +instanceKlass org/jetbrains/kotlin/psi/stubs/KotlinFileStub +instanceKlass org/jetbrains/kotlin/parsing/KotlinParserDefinition$Companion +instanceKlass org/jetbrains/kotlin/parsing/KotlinParserDefinition +instanceKlass org/jetbrains/kotlin/com/intellij/util/keyFMap/OneElementFMap +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/impl/ExtensionProcessingHelper +instanceKlass org/jetbrains/kotlin/com/intellij/lang/LanguageUtil$$Lambda$82 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass gnu/trove/TObjectProcedure +instanceKlass java/time/zone/ZoneOffsetTransitionRule$1 +instanceKlass java/time/chrono/AbstractChronology +instanceKlass java/time/chrono/Chronology +instanceKlass java/time/LocalDate$1 +instanceKlass java/time/temporal/TemporalAdjusters$$Lambda$81 +instanceKlass java/time/temporal/TemporalAdjusters +instanceKlass jdk/nio/zipfs/ZipFileSystem$$Lambda$80 +instanceKlass gnu/trove/TIterator +instanceKlass gnu/trove/THashMap$MapBackedView +instanceKlass org/jetbrains/kotlin/org/jdom/ContentList$CLIterator +instanceKlass org/jetbrains/kotlin/org/jdom/ContentList$FilterListIterator +instanceKlass org/jetbrains/kotlin/org/jdom/filter2/AbstractFilter +instanceKlass org/jetbrains/kotlin/org/jdom/filter2/Filter +instanceKlass org/jetbrains/kotlin/org/jdom/filter/AbstractFilter +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/XmlReader +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/ContainerDescriptor +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/IdeaPluginDescriptorImpl +instanceKlass org/jetbrains/kotlin/org/jdom/internal/ArrayCopy +instanceKlass org/jetbrains/kotlin/org/jdom/AttributeList$1 +instanceKlass org/jetbrains/kotlin/org/jdom/Parent +instanceKlass com/sun/org/apache/xerces/internal/util/XMLChar +instanceKlass org/jetbrains/kotlin/org/jdom/CloneBase +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/SafeStAXStreamBuilder +instanceKlass com/sun/xml/internal/stream/util/BufferAllocator +instanceKlass com/sun/xml/internal/stream/util/ThreadLocalBufferAllocator +instanceKlass com/sun/xml/internal/stream/Entity +instanceKlass com/sun/org/apache/xerces/internal/util/XMLSymbols +instanceKlass com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer +instanceKlass com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter +instanceKlass com/sun/org/apache/xerces/internal/util/MessageFormatter +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLErrorReporter +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLEntityScanner +instanceKlass com/sun/org/apache/xerces/internal/xni/XMLLocator +instanceKlass com/sun/xml/internal/stream/XMLEntityStorage +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLEntityManager +instanceKlass com/sun/org/apache/xerces/internal/xni/parser/XMLEntityResolver +instanceKlass com/sun/org/apache/xerces/internal/util/NamespaceContextWrapper +instanceKlass javax/xml/namespace/NamespaceContext +instanceKlass com/sun/org/apache/xerces/internal/xni/grammars/XMLDTDDescription +instanceKlass com/sun/org/apache/xerces/internal/xni/grammars/XMLGrammarDescription +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl$TrailingMiscDriver +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl$PrologDriver +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl$XMLDeclDriver +instanceKlass com/sun/org/apache/xerces/internal/util/NamespaceSupport +instanceKlass com/sun/org/apache/xerces/internal/xni/NamespaceContext +instanceKlass com/sun/org/apache/xerces/internal/util/AugmentationsImpl$AugmentationsItemsContainer +instanceKlass com/sun/org/apache/xerces/internal/util/AugmentationsImpl +instanceKlass com/sun/org/apache/xerces/internal/xni/Augmentations +instanceKlass com/sun/org/apache/xerces/internal/util/XMLAttributesImpl$Attribute +instanceKlass com/sun/org/apache/xerces/internal/util/XMLAttributesImpl +instanceKlass com/sun/org/apache/xerces/internal/xni/XMLAttributes +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl$FragmentContentDriver +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl$Driver +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl$ElementStack2 +instanceKlass com/sun/org/apache/xerces/internal/xni/QName +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl$ElementStack +instanceKlass com/sun/org/apache/xerces/internal/util/XMLResourceIdentifierImpl +instanceKlass com/sun/org/apache/xerces/internal/xni/XMLResourceIdentifier +instanceKlass com/sun/org/apache/xerces/internal/xni/XMLString +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLScanner +instanceKlass com/sun/xml/internal/stream/XMLBufferListener +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLEntityHandler +instanceKlass com/sun/org/apache/xerces/internal/xni/parser/XMLComponent +instanceKlass com/sun/org/apache/xerces/internal/xni/parser/XMLDocumentScanner +instanceKlass com/sun/org/apache/xerces/internal/xni/parser/XMLDocumentSource +instanceKlass com/sun/org/apache/xerces/internal/util/SymbolTable$Entry +instanceKlass com/sun/org/apache/xerces/internal/util/SymbolTable +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLStreamReaderImpl +instanceKlass javax/xml/stream/XMLStreamReader +instanceKlass javax/xml/stream/XMLStreamConstants +instanceKlass com/sun/org/apache/xerces/internal/xni/parser/XMLInputSource +instanceKlass javax/xml/stream/FactoryFinder$$Lambda$79 +instanceKlass javax/xml/parsers/SAXParserFactory +instanceKlass jdk/xml/internal/JdkXmlUtils +instanceKlass com/sun/org/apache/xerces/internal/utils/XMLSecurityPropertyManager +instanceKlass jdk/xml/internal/SecuritySupport$$Lambda$78 +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/ClassSpecializer$Factory$1Var +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass com/sun/org/apache/xerces/internal/utils/XMLSecurityManager +instanceKlass com/sun/org/apache/xerces/internal/impl/PropertyManager +instanceKlass jdk/xml/internal/SecuritySupport$$Lambda$77 +instanceKlass javax/xml/stream/FactoryFinder$$Lambda$76 +instanceKlass javax/xml/stream/FactoryFinder$$Lambda$75 +instanceKlass jdk/xml/internal/SecuritySupport$$Lambda$74 +instanceKlass jdk/xml/internal/SecuritySupport +instanceKlass javax/xml/stream/FactoryFinder +instanceKlass javax/xml/stream/XMLInputFactory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/CharsetToolkit +instanceKlass java/util/concurrent/TimeUnit$1 +instanceKlass java/time/zone/ZoneOffsetTransition +instanceKlass java/time/zone/ZoneOffsetTransitionRule +instanceKlass java/time/zone/ZoneRules +instanceKlass java/time/zone/Ser +instanceKlass java/io/Externalizable +instanceKlass java/time/zone/ZoneRulesProvider$1 +instanceKlass java/time/zone/ZoneRulesProvider +instanceKlass java/time/ZoneId +instanceKlass java/time/LocalTime +instanceKlass java/time/temporal/ValueRange +instanceKlass java/time/Duration +instanceKlass java/time/temporal/TemporalAmount +instanceKlass java/time/temporal/TemporalUnit +instanceKlass java/time/temporal/TemporalField +instanceKlass java/time/LocalDate +instanceKlass java/time/chrono/ChronoLocalDate +instanceKlass java/time/LocalDateTime +instanceKlass java/time/chrono/ChronoLocalDateTime +instanceKlass java/time/temporal/TemporalAdjuster +instanceKlass java/time/temporal/Temporal +instanceKlass java/time/temporal/TemporalAccessor +instanceKlass jdk/nio/zipfs/ZipUtils +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/JDOMUtil$EmptyTextFilter +instanceKlass org/jetbrains/kotlin/org/jdom/filter/Filter +instanceKlass org/jetbrains/kotlin/org/jdom/Verifier +instanceKlass org/jetbrains/kotlin/org/jdom/Namespace +instanceKlass org/jetbrains/kotlin/org/jdom/output/XMLOutputter +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/JDOMUtil +instanceKlass jdk/internal/util/ArraysSupport +instanceKlass jdk/nio/zipfs/ZipFileSystem$END +instanceKlass jdk/nio/zipfs/ZipConstants +instanceKlass java/nio/DirectByteBuffer$Deallocator +instanceKlass sun/nio/ch/Util$BufferCache +instanceKlass sun/nio/ch/Util +instanceKlass sun/nio/ch/IOStatus +instanceKlass sun/nio/ch/NativeThread +instanceKlass java/nio/channels/spi/AbstractInterruptibleChannel$1 +instanceKlass sun/nio/ch/Interruptible +instanceKlass sun/nio/fs/WindowsChannelFactory$2 +instanceKlass sun/nio/fs/WindowsSecurityDescriptor +instanceKlass jdk/nio/zipfs/ZipPath +instanceKlass jdk/nio/zipfs/ZipCoder +instanceKlass sun/nio/fs/WindowsSecurity +instanceKlass sun/nio/fs/AbstractAclFileAttributeView +instanceKlass java/nio/file/attribute/AclFileAttributeView +instanceKlass java/nio/file/attribute/FileOwnerAttributeView +instanceKlass sun/nio/fs/WindowsLinkSupport +instanceKlass jdk/nio/zipfs/ZipFileSystem$$Lambda$73 +instanceKlass sun/nio/fs/WindowsFileSystemProvider$1 +instanceKlass sun/nio/ch/FileChannelImpl$Closer +instanceKlass sun/nio/ch/NativeDispatcher +instanceKlass sun/nio/ch/NativeThreadSet +instanceKlass sun/nio/ch/IOUtil$1 +instanceKlass sun/nio/ch/IOUtil +instanceKlass sun/nio/fs/WindowsChannelFactory$Flags +instanceKlass sun/nio/fs/WindowsChannelFactory$1 +instanceKlass sun/nio/fs/WindowsChannelFactory +instanceKlass java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock +instanceKlass java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock +instanceKlass java/util/concurrent/locks/ReentrantReadWriteLock +instanceKlass jdk/nio/zipfs/ZipFileSystem$$Lambda$72 +instanceKlass java/nio/file/PathMatcher +instanceKlass jdk/nio/zipfs/ZipFileAttributes +instanceKlass jdk/nio/zipfs/ZipFileSystem$IndexNode +instanceKlass java/util/concurrent/locks/ReadWriteLock +instanceKlass sun/net/www/protocol/jrt/JavaRuntimeURLConnection$$Lambda$71 +instanceKlass java/nio/file/DirectoryStream +instanceKlass java/nio/file/DirectoryStream$Filter +instanceKlass java/nio/file/FileStore +instanceKlass java/nio/channels/AsynchronousFileChannel +instanceKlass java/nio/channels/AsynchronousChannel +instanceKlass java/nio/channels/spi/AbstractInterruptibleChannel +instanceKlass java/nio/channels/InterruptibleChannel +instanceKlass java/nio/channels/ScatteringByteChannel +instanceKlass java/nio/channels/GatheringByteChannel +instanceKlass java/nio/channels/SeekableByteChannel +instanceKlass java/nio/channels/ByteChannel +instanceKlass java/nio/channels/WritableByteChannel +instanceKlass java/nio/channels/ReadableByteChannel +instanceKlass java/nio/channels/Channel +instanceKlass java/nio/file/attribute/FileAttribute +instanceKlass java/nio/file/spi/FileSystemProvider$1 +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/PluginDescriptorLoader +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/BasePathResolver +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/PathBasedJdomXIncluder$PathResolver +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/PathBasedJdomXIncluder +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/DescriptorLoadingContext +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/DescriptorListLoadingContext$$Lambda$70 +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/ReferenceOpenHashSet$SetIterator +instanceKlass java/util/Date +instanceKlass java/text/DigitList +instanceKlass java/text/FieldPosition +instanceKlass sun/util/locale/provider/JRELocaleProviderAdapter$$Lambda$69 +instanceKlass java/text/DecimalFormatSymbols +instanceKlass sun/util/locale/provider/JRELocaleProviderAdapter$$Lambda$68 +instanceKlass sun/util/locale/provider/JRELocaleProviderAdapter$$Lambda$67 +instanceKlass java/text/DateFormatSymbols +instanceKlass sun/util/calendar/CalendarUtils +instanceKlass sun/util/calendar/CalendarDate +instanceKlass sun/util/resources/Bundles$CacheKeyReference +instanceKlass java/util/ResourceBundle$ResourceBundleProviderHelper$$Lambda$66 +instanceKlass java/util/ResourceBundle$ResourceBundleProviderHelper +instanceKlass sun/util/resources/Bundles$CacheKey +instanceKlass java/util/ResourceBundle$1 +instanceKlass jdk/internal/misc/JavaUtilResourceBundleAccess +instanceKlass sun/util/resources/Bundles +instanceKlass sun/util/resources/LocaleData$LocaleDataStrategy +instanceKlass sun/util/resources/Bundles$Strategy +instanceKlass sun/util/resources/LocaleData$1 +instanceKlass sun/util/cldr/CLDRLocaleProviderAdapter$$Lambda$65 +instanceKlass sun/util/locale/provider/CalendarDataUtility$CalendarWeekParameterGetter +instanceKlass sun/util/locale/provider/LocaleServiceProviderPool$LocalizedObjectGetter +instanceKlass sun/util/locale/provider/LocaleServiceProviderPool +instanceKlass sun/util/locale/provider/CalendarDataUtility +instanceKlass sun/util/calendar/CalendarSystem +instanceKlass java/util/Calendar$Builder +instanceKlass java/util/StringTokenizer +instanceKlass sun/util/locale/provider/AvailableLanguageTags +instanceKlass sun/util/locale/provider/JRELocaleProviderAdapter$$Lambda$64 +instanceKlass sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo +instanceKlass jdk/internal/jimage/decompressor/ZipDecompressor +instanceKlass jdk/internal/jimage/decompressor/ResourceDecompressor +instanceKlass jdk/internal/jimage/decompressor/ResourceDecompressorFactory +instanceKlass jdk/internal/jimage/decompressor/ResourceDecompressorRepository +instanceKlass jdk/internal/jimage/decompressor/CompressedResourceHeader +instanceKlass jdk/internal/jimage/BasicImageReader$$Lambda$63 +instanceKlass jdk/internal/jimage/decompressor/ResourceDecompressor$StringsProvider +instanceKlass jdk/internal/jimage/ImageBufferCache$2 +instanceKlass jdk/internal/jimage/ImageBufferCache +instanceKlass jdk/internal/module/ModulePatcher$PatchedModuleReader +instanceKlass sun/util/cldr/CLDRLocaleProviderAdapter$1 +instanceKlass sun/util/locale/StringTokenIterator +instanceKlass sun/util/locale/ParseStatus +instanceKlass sun/util/cldr/CLDRBaseLocaleDataMetaInfo +instanceKlass sun/util/locale/provider/LocaleDataMetaInfo +instanceKlass sun/util/locale/provider/LocaleProviderAdapter$1 +instanceKlass java/util/ResourceBundle +instanceKlass java/util/ResourceBundle$Control +instanceKlass sun/util/resources/LocaleData +instanceKlass sun/util/locale/provider/LocaleResources +instanceKlass sun/util/locale/LanguageTag +instanceKlass sun/util/locale/provider/ResourceBundleBasedAdapter +instanceKlass sun/util/locale/provider/LocaleProviderAdapter +instanceKlass java/util/spi/LocaleServiceProvider +instanceKlass java/util/zip/Checksum$1 +instanceKlass java/util/zip/CRC32 +instanceKlass java/util/zip/Checksum +instanceKlass sun/util/calendar/ZoneInfoFile$ZoneOffsetTransitionRule +instanceKlass sun/util/calendar/ZoneInfoFile$1 +instanceKlass sun/util/calendar/ZoneInfoFile +instanceKlass java/util/TimeZone +instanceKlass java/util/Calendar +instanceKlass java/text/AttributedCharacterIterator$Attribute +instanceKlass java/text/Format +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/SafeJdomFactory$BaseSafeJdomFactory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/SafeJdomFactory +instanceKlass java/util/concurrent/AbstractExecutorService +instanceKlass org/jetbrains/kotlin/com/intellij/util/PlatformUtils +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/PluginManagerCore$$Lambda$62 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/BuildNumber +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/PluginLoadingResult +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/DescriptorListLoadingContext +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/IdeaPluginDescriptor +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/PluginManagerCore +instanceKlass org/jetbrains/kotlin/com/intellij/psi/JavaModuleSystem +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/ClsCustomNavigationPolicy +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/IdeaExtensionPoints +instanceKlass org/jetbrains/kotlin/com/intellij/codeInsight/runner/JavaMainMethodProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/augment/PsiAugmentProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/meta/MetaDataContributor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/FileContextProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/util/MethodSignature +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/QueryExecutorBase +instanceKlass org/jetbrains/kotlin/com/intellij/util/QueryExecutor +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/SmartExtensionPoint +instanceKlass org/jetbrains/kotlin/com/intellij/util/Query +instanceKlass org/jetbrains/kotlin/com/intellij/util/QueryFactory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/registry/RegistryValue +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/registry/Registry +instanceKlass org/jetbrains/kotlin/com/intellij/lang/folding/FoldingBuilderEx +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/project/PossiblyDumbAware +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/project/DumbAware +instanceKlass org/jetbrains/kotlin/com/intellij/lang/folding/FoldingBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/codeInsight/folding/JavaCodeFoldingSettings +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiParameter +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmParameter +instanceKlass org/jetbrains/kotlin/com/intellij/psi/presentation/java/VariablePresentationProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiLocalVariable +instanceKlass org/jetbrains/kotlin/com/intellij/psi/presentation/java/FieldPresentationProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiField +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiVariable +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmField +instanceKlass org/jetbrains/kotlin/com/intellij/psi/presentation/java/MethodPresentationProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiMethod +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiParameterListOwner +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmMethod +instanceKlass org/jetbrains/kotlin/com/intellij/psi/presentation/java/ClassPresentationProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiClass +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiTypeParameterListOwner +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiJvmMember +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiTarget +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiNameIdentifierOwner +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiDocCommentOwner +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiMember +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiJavaDocumentedElement +instanceKlass org/jetbrains/kotlin/com/intellij/pom/PomRenameableTarget +instanceKlass org/jetbrains/kotlin/com/intellij/pom/PomNamedTarget +instanceKlass org/jetbrains/kotlin/com/intellij/pom/PomTarget +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmClass +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmTypeParametersOwner +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmMember +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmTypeDeclaration +instanceKlass org/jetbrains/kotlin/com/intellij/navigation/ItemPresentation +instanceKlass org/jetbrains/kotlin/com/intellij/psi/presentation/java/PackagePresentationProvider +instanceKlass org/jetbrains/kotlin/com/intellij/navigation/ItemPresentationProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiPackage +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiQualifiedNamedElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiJvmModifiersOwner +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiModifierListOwner +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmModifiersOwner +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiDirectoryContainer +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmPackage +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmNamedElement +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmAnnotatedElement +instanceKlass org/jetbrains/kotlin/com/intellij/lang/jvm/JvmElement +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/projectRoots/JavaVersionService +instanceKlass org/jetbrains/kotlin/com/intellij/psi/JavaDirectoryService +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiSubstitutor +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiSubstitutorFactory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/ModificationTracker$$Lambda$61 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/ModificationTracker$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/file/PsiPackageImplementationHelper +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/impl/ExtensionPointImpl$$Lambda$60 +instanceKlass org/jetbrains/kotlin/com/intellij/util/graph/InboundSemiGraph +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/LoadingOrder +instanceKlass org/jetbrains/kotlin/com/intellij/codeInsight/JavaContainerProvider +instanceKlass org/jetbrains/kotlin/com/intellij/codeInsight/ContainerProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiExpressionEvaluator +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/ConstantExpressionEvaluator +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/IndexSink +instanceKlass org/jetbrains/kotlin/com/intellij/util/diff/FlyweightCapableTreeStructure +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/LightStubBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/java/stubs/PsiJavaFileStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/PsiClassHolderFileStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/StubBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/PsiFileStub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/StubElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/StubSerializer +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/ObjectStubSerializer +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/JavaParserDefinition +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/components/ServiceManager +instanceKlass org/jetbrains/kotlin/com/intellij/psi/javadoc/PsiDocToken +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiKeyword +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiIdentifier +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiJavaToken +instanceKlass org/jetbrains/kotlin/com/intellij/psi/javadoc/PsiDocTagValue +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/Stub +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/ClassFileStubBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/BinaryFileStubBuilder$CompositeBinaryFileStubBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/BinaryFileStubBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/psi/FileViewProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/ClassFileViewProviderFactory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/FileViewProviderFactory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Condition$3 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Condition$2 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Condition$1 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Conditions +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/IElementType$$Lambda$59 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/IElementType$Predicate +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/IElementType$$Lambda$58 +instanceKlass org/jetbrains/kotlin/com/intellij/lexer/Lexer +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/fileTypes/PlainTextParserDefinition +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/KeyedExtensionCollector$$Lambda$57 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/lang/LanguageUtil$$Lambda$56 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/lang/LanguageUtil +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiPlainText +instanceKlass org/jetbrains/kotlin/com/intellij/lang/ASTFactory$DefaultFactoryHolder +instanceKlass org/jetbrains/kotlin/com/intellij/ide/highlighter/ArchiveFileType +instanceKlass java/util/concurrent/BlockingQueue +instanceKlass java/util/concurrent/ExecutorService +instanceKlass org/jetbrains/kotlin/com/intellij/util/ConcurrencyUtil +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/fileTypes/LanguageFileType +instanceKlass org/jetbrains/kotlin/com/intellij/ide/highlighter/JavaClassFileType +instanceKlass org/jetbrains/kotlin/com/intellij/util/pico/CachingConstructorInjectionComponentAdapter +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/ApplicationInfo +instanceKlass org/jetbrains/kotlin/com/intellij/util/graph/GraphAlgorithms +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/impl/MessageBusImpl$$Lambda$55 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/command/impl/CoreCommandProcessor$1 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/command/CommandListener +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/command/CommandToken +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/command/CommandProcessor +instanceKlass org/jetbrains/kotlin/com/intellij/codeInsight/folding/CodeFoldingSettings +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentLongObjectHashMap$Node +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentLongObjectMap$LongEntry +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentLongObjectHashMap +instanceKlass java/util/concurrent/Future +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/PerformInBackgroundOption +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/ProgressIndicator +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/Task +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/TaskInfo +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/Progressive +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiReferenceService +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/ObjectStubTree +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/StubTreeLoader +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiReferenceProviderBean$$Lambda$54 +instanceKlass org/jetbrains/kotlin/com/intellij/patterns/ElementPattern +instanceKlass org/jetbrains/kotlin/com/intellij/patterns/ElementPatternBean +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiReferenceContributor +instanceKlass org/jetbrains/kotlin/com/intellij/model/psi/PsiSymbolReference +instanceKlass org/jetbrains/kotlin/com/intellij/model/SymbolReference +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiReferenceRegistrar +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiReferenceProvider +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/resolve/reference/ReferenceProvidersRegistry +instanceKlass org/jetbrains/kotlin/com/intellij/lang/PsiBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/UserDataHolderUnprotected +instanceKlass org/jetbrains/kotlin/com/intellij/lang/SyntaxTreeBuilder +instanceKlass org/jetbrains/kotlin/com/intellij/lang/PsiBuilderFactory +instanceKlass org/jetbrains/kotlin/com/intellij/psi/CommonClassNames +instanceKlass gnu/trove/HashFunctions +instanceKlass gnu/trove/TIntObjectProcedure +instanceKlass gnu/trove/TIntHashingStrategy +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/CharTableImpl +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiLanguageInjectionHost +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiComment +instanceKlass org/jetbrains/kotlin/com/intellij/model/psi/UrlReferenceHost +instanceKlass org/jetbrains/kotlin/com/intellij/model/psi/PsiExternalReferenceHost +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiWhiteSpace +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/ILazyParseableElementTypeBase +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/IElementType +instanceKlass org/jetbrains/kotlin/com/intellij/lang/FileASTNode +instanceKlass org/jetbrains/kotlin/com/intellij/lang/ASTNode +instanceKlass org/jetbrains/kotlin/com/intellij/util/CharTable +instanceKlass org/jetbrains/kotlin/com/intellij/lang/ASTFactory +instanceKlass org/jetbrains/kotlin/com/intellij/lang/DefaultASTFactory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/encoding/EncodingRegistry +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/AbstractExtensionPointBean +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/PluginAware +instanceKlass org/jetbrains/kotlin/com/intellij/util/KeyedLazyInstance +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/impl/BulkVirtualFileListenerAdapter +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/impl/BaseBusConnection +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/impl/MessageBusImpl$MessageHandlerHolder +instanceKlass java/util/EventObject +instanceKlass org/jetbrains/kotlin/com/intellij/util/EventDispatcher$$Lambda$53 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/StaticGetter +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/newvfs/CachingVirtualFileSystem +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/KeyedExtensionCollector$$Lambda$52 +instanceKlass java/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater$1 +instanceKlass java/util/concurrent/atomic/AtomicLongFieldUpdater +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VirtualFileManager$$Lambda$51 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/newvfs/BulkFileListener +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/Topic +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VirtualFileManager +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/EmptyRunnable +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/impl/ExtensionPointImpl$$Lambda$50 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/ExtensionPointAdapter +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/ExtensionPointAndAreaListener +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/ExtensionPointListener +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/impl/ExtensionComponentAdapter +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/LoadingOrder$Orderable +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/PluginId$$Lambda$49 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/PluginId +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/DefaultPluginDescriptor +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VirtualFileManagerListener +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/BaseExtensionPointName +instanceKlass org/jetbrains/kotlin/com/intellij/core/CoreApplicationEnvironment$$Lambda$48 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/fileEditor/FileDocumentManager +instanceKlass org/jetbrains/kotlin/cli/jvm/modules/CoreJrtFileSystem$handlers$1 +instanceKlass org/jetbrains/kotlin/cli/jvm/modules/CoreJrtFileSystem$Companion +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentFactoryMap +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/impl/jar/CoreJarFileSystem$$Lambda$47 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/impl/ArchiveHandler +instanceKlass org/jetbrains/kotlin/com/intellij/util/EventDispatcher +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VirtualFileListener +instanceKlass java/util/EventListener +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/CachedSingletonsRegistry +instanceKlass org/jetbrains/kotlin/com/intellij/util/SmartList$$Lambda$46 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/ApplicationManager$2 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/ApplicationManager +instanceKlass org/jetbrains/kotlin/com/intellij/core/CoreApplicationEnvironment$$Lambda$45 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/Extensions$$Lambda$44 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/Extensions +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/ObjectNode +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/impl/ExtensionPointImpl +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/PluginDescriptor +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/ExtensionPoint +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl +instanceKlass org/jetbrains/kotlin/com/intellij/util/pico/DefaultPicoContainer$InstanceComponentAdapter +instanceKlass org/jetbrains/kotlin/com/intellij/util/pico/DefaultPicoContainer$LinkedHashSetWrapper +instanceKlass org/jetbrains/kotlin/org/picocontainer/ComponentAdapter +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/impl/MessageBusImpl$RootBus$$Lambda$43 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/LockFreeCopyOnWriteArrayList +instanceKlass org/jetbrains/kotlin/com/intellij/util/ArrayUtil$$Lambda$42 +instanceKlass org/jetbrains/kotlin/com/intellij/util/ArrayUtil$$Lambda$41 +instanceKlass org/jetbrains/kotlin/com/intellij/util/ArrayFactory +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/util/ArrayUtil +instanceKlass java/util/concurrent/ConcurrentLinkedQueue$Node +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/impl/MessageBusImpl$$Lambda$40 +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/impl/JobQueue +instanceKlass java/util/concurrent/Executor +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/impl/MessageBusImpl$MessagePublisher +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/MessageBusConnection +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/SimpleMessageBusConnection +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/impl/MessageBusImpl +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/impl/MessageBusEx +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/MessageBusFactory +instanceKlass org/jetbrains/kotlin/com/intellij/util/keyFMap/DebugFMap +instanceKlass org/jetbrains/kotlin/com/intellij/util/keyFMap/EmptyFMap +instanceKlass org/jetbrains/kotlin/com/intellij/util/BitUtil +instanceKlass org/jetbrains/kotlin/com/intellij/util/keyFMap/KeyFMap +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/ModalityState +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/ExtensionsArea +instanceKlass org/jetbrains/kotlin/com/intellij/util/pico/DefaultPicoContainer +instanceKlass org/jetbrains/kotlin/org/picocontainer/MutablePicoContainer +instanceKlass org/jetbrains/kotlin/org/picocontainer/PicoContainer +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/MessageBus +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/fileTypes/UnknownFileType +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/CaseInsensitiveStringHashingStrategy +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/Object2ObjectMap$FastEntrySet +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/AbstractObject2ObjectFunction +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/Object2ObjectMap +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/Object2ObjectFunction +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/CollectionFactory$1 +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/Hash$Strategy +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/CollectionFactory +instanceKlass org/jetbrains/kotlin/com/intellij/ide/plugins/DisabledPluginsState +instanceKlass org/jetbrains/kotlin/com/intellij/lang/ParserDefinition +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/fileTypes/FileType +instanceKlass org/jetbrains/kotlin/com/intellij/concurrency/JobLauncher +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/Document +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/MessageBusOwner +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/ex/ApplicationEx +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/ProgressIndicatorProvider +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/KeyedExtensionCollector +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/SimpleModificationTracker +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/ModificationTracker +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VirtualFileSystem +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/Application +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/components/ComponentManager +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/AreaInstance +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/fileTypes/FileTypeRegistry +instanceKlass org/jetbrains/kotlin/com/intellij/core/CoreApplicationEnvironment +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment$Companion +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment +instanceKlass org/jetbrains/kotlin/cli/jvm/config/JavaSourceRoot +instanceKlass org/jetbrains/kotlin/cli/jvm/config/JvmContentRootsKt +instanceKlass org/jetbrains/kotlin/cli/common/config/KotlinSourceRoot +instanceKlass org/jetbrains/kotlin/cli/common/config/ContentRootsKt +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler +instanceKlass org/jetbrains/kotlin/cli/common/modules/ModuleChunk +instanceKlass org/jetbrains/kotlin/modules/JavaRootPath +instanceKlass org/jetbrains/kotlin/cli/common/modules/ModuleBuilder +instanceKlass org/jetbrains/kotlin/modules/Module +instanceKlass org/jetbrains/kotlin/config/JVMConstructorCallNormalizationMode$Companion +instanceKlass org/jetbrains/kotlin/config/JvmAbiStability$Companion +instanceKlass org/jetbrains/kotlin/config/LanguageVersionSettings$DefaultImpls +instanceKlass org/jetbrains/kotlin/config/LanguageFeature$Companion +instanceKlass org/jetbrains/kotlin/config/CompilerConfiguration$$Lambda$39 +instanceKlass org/jetbrains/kotlin/cli/jvm/config/JvmClasspathRoot +instanceKlass org/jetbrains/kotlin/cli/jvm/config/JvmContentRoot +instanceKlass org/jetbrains/kotlin/cli/common/config/ContentRoot +instanceKlass org/jetbrains/kotlin/kapt3/Kapt3CommandLineProcessor$WhenMappings +instanceKlass org/jetbrains/kotlin/compiler/plugin/CommandLineProcessor$DefaultImpls +instanceKlass java/io/Bits +instanceKlass java/io/ObjectInputFilter$Config$$Lambda$38 +instanceKlass jdk/internal/misc/JavaObjectInputFilterAccess +instanceKlass java/io/ObjectInputFilter$Config$$Lambda$37 +instanceKlass java/io/ObjectInputFilter +instanceKlass java/io/ObjectInputFilter$Config +instanceKlass java/io/ObjectInputStream$ValidationList +instanceKlass java/io/ObjectInputStream$HandleTable$HandleList +instanceKlass java/io/ObjectInputStream$HandleTable +instanceKlass java/io/ObjectInputStream$$Lambda$36 +instanceKlass jdk/internal/misc/JavaObjectInputStreamReadString +instanceKlass java/io/ObjectInputStream$$Lambda$35 +instanceKlass jdk/internal/misc/JavaObjectInputStreamAccess +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/io/ObjectStreamConstants +instanceKlass java/io/ObjectInput +instanceKlass java/util/Base64$Encoder +instanceKlass java/util/Base64$Decoder +instanceKlass java/util/Base64 +instanceKlass org/jetbrains/kotlin/utils/PluginUtilsKt +instanceKlass org/jetbrains/kotlin/base/kapt3/KaptSelector +instanceKlass org/jetbrains/kotlin/base/kapt3/KaptOptions$Builder +instanceKlass org/jetbrains/kotlin/kapt3/Kapt3PluginKt +instanceKlass java/util/AbstractList$Itr +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/MultiMap$$Lambda$34 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/MultiMap +instanceKlass org/jetbrains/kotlin/compiler/plugin/CliOptionValue +instanceKlass org/jetbrains/kotlin/compiler/plugin/CliOptionsKt +instanceKlass org/jetbrains/kotlin/cli/jvm/plugins/PluginCliParserKt +instanceKlass org/jetbrains/kotlin/kapt/cli/KaptCliOption$Companion +instanceKlass org/jetbrains/kotlin/kapt/cli/CliToolOption +instanceKlass org/jetbrains/kotlin/compiler/plugin/AbstractCliOption +instanceKlass org/jetbrains/kotlin/kapt3/Kapt3CommandLineProcessor +instanceKlass org/jetbrains/kotlin/compiler/plugin/CommandLineProcessor +instanceKlass org/jetbrains/kotlin/config/CompilerConfiguration$$Lambda$33 +instanceKlass org/jetbrains/kotlin/compiler/plugin/ComponentRegistrar$Companion +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeComponentRegistrar$Companion +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeComponentRegistrar +instanceKlass org/jetbrains/kotlin/kapt3/Kapt3ComponentRegistrar +instanceKlass java/io/FilePermissionCollection$1 +instanceKlass java/net/URLClassLoader$1 +instanceKlass java/io/RandomAccessFile$1 +instanceKlass kotlin/io/LinesSequence$iterator$1 +instanceKlass kotlin/io/LinesSequence +instanceKlass kotlin/io/TextStreamsKt +instanceKlass java/util/zip/ZipFile$$Lambda$32 +instanceKlass kotlin/io/FilesKt__FilePathComponentsKt +instanceKlass sun/nio/fs/WindowsUriSupport +instanceKlass org/jetbrains/kotlin/compiler/plugin/ComponentRegistrar +instanceKlass org/jetbrains/kotlin/cli/jvm/plugins/ServiceLoaderLite +instanceKlass java/net/URLClassLoader$7 +instanceKlass jdk/internal/misc/JavaNetURLClassLoaderAccess +instanceKlass org/jetbrains/kotlin/cli/common/messages/MessageCollector$DefaultImpls +instanceKlass org/jetbrains/kotlin/cli/jvm/plugins/PluginCliParser +instanceKlass kotlin/jvm/internal/ArrayIterator +instanceKlass kotlin/jvm/internal/ArrayIteratorKt +instanceKlass kotlin/collections/ArrayAsCollection +instanceKlass kotlin/collections/ArraysKt___ArraysKt$asIterable$$inlined$Iterable$1 +instanceKlass org/jetbrains/kotlin/backend/common/phaser/PhaseConfig +instanceKlass org/jetbrains/kotlin/backend/common/phaser/SameTypeCompilerPhase$DefaultImpls +instanceKlass org/jetbrains/kotlin/backend/common/phaser/CompilerPhase$DefaultImpls +instanceKlass org/jetbrains/kotlin/backend/common/phaser/PhaseConfigKt +instanceKlass org/jetbrains/kotlin/cli/common/CreatePhaseConfigKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/BytecodeInliningPreparationLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCallsKt +instanceKlass org/jetbrains/kotlin/com/intellij/psi/StubBasedPsiElement +instanceKlass org/jetbrains/kotlin/psi/KtModifierListOwner +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiFileWithStubSupport +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiFileEx +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/ui/Queryable +instanceKlass org/jetbrains/kotlin/psi/KtDeclarationContainer +instanceKlass org/jetbrains/kotlin/psi/KtAnnotated +instanceKlass org/jetbrains/kotlin/psi/KtElement +instanceKlass org/jetbrains/kotlin/psi/KtPureElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiModifiableCodeBlock +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiClassOwner +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiFile +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiFileSystemItem +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiCheckedRenameElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiNamedElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/NavigatablePsiElement +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiElement +instanceKlass org/jetbrains/kotlin/com/intellij/navigation/NavigationItem +instanceKlass org/jetbrains/kotlin/com/intellij/pom/Navigatable +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/UserDataHolderBase +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/UserDataHolderEx +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/UserDataHolder +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Iconable +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacadesKt +instanceKlass org/jetbrains/kotlin/backend/common/phaser/PerformByIrFilePhase +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/FileClassLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/ScriptLoweringKt +instanceKlass org/jetbrains/kotlin/backend/common/phaser/CompositePhase +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/ProcessOptionalAnnotationsKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/FakeInliningLocalVariablesLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/RenameFieldsLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/ReplaceKFunctionInvokeWithFunctionInvokeKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/TypeOperatorLoweringKt +instanceKlass org/jetbrains/kotlin/name/Name +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/AdditionalClassAnnotationLoweringKt +instanceKlass org/jetbrains/kotlin/backend/common/lower/IfNullExpressionsFusionLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/JvmOptimizationLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/ToArrayLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/JvmArgumentNullabilityAssertionsLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/BridgeLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/FunctionNVarargBridgeLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/EnumClassLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/TailCallOptimizationLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/JvmStringConcatenationLoweringKt +instanceKlass org/jetbrains/kotlin/backend/common/lower/optimizations/FoldConstantLoweringKt +instanceKlass org/jetbrains/kotlin/backend/common/lower/FlattenStringConcatenationLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/StaticCallableReferenceLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/JvmSingleAbstractMethodLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/SingletonReferencesLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/MappedEnumWhenLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/JvmInlineClassLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLoweringKt +instanceKlass org/jetbrains/kotlin/backend/common/lower/loops/ForLoopsLoweringKt +instanceKlass org/jetbrains/kotlin/backend/common/lower/RangeContainsLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/JvmStandardLibraryBuiltInsLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/AnonymousObjectSuperConstructorLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/ConstLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/SuspendLambdaLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/CheckNotNullLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/VarargLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/PolymorphicSignatureLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/AnnotationLoweringKt +instanceKlass org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/InventNamesForLocalClassesKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/MainMethodGenerationLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/JvmOverloadsAnnotationLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/TypeAliasAnnotationMethodsLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/StaticDefaultFunctionLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/ObjectClassLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/AssertionLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/InlineCallableReferenceToLambdaKt +instanceKlass org/jetbrains/kotlin/backend/common/lower/SharedVariablesLoweringKt +instanceKlass org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLoweringKt +instanceKlass org/jetbrains/kotlin/backend/common/lower/PropertiesLowering$Companion +instanceKlass org/jetbrains/kotlin/backend/common/lower/PropertiesLowering +instanceKlass org/jetbrains/kotlin/backend/common/DeclarationTransformer +instanceKlass org/jetbrains/kotlin/backend/common/FileLoweringPass +instanceKlass org/jetbrains/kotlin/backend/common/phaser/ModuleLoweringPhaseAdapter +instanceKlass org/jetbrains/kotlin/backend/common/phaser/FileLoweringPhaseAdapter +instanceKlass org/jetbrains/kotlin/backend/common/phaser/CustomPhaseAdapter +instanceKlass org/jetbrains/kotlin/backend/common/phaser/NamedCompilerPhase +instanceKlass org/jetbrains/kotlin/backend/common/phaser/SameTypeCompilerPhase +instanceKlass org/jetbrains/kotlin/backend/common/phaser/CompilerPhase +instanceKlass org/jetbrains/kotlin/backend/common/phaser/CompilerPhaseKt +instanceKlass org/jetbrains/kotlin/backend/common/phaser/DumperVerifierKt +instanceKlass org/jetbrains/kotlin/backend/common/phaser/PhaseBuildersKt +instanceKlass org/jetbrains/kotlin/backend/jvm/JvmLowerKt +instanceKlass java/lang/reflect/AccessibleObject$$Lambda$31 +instanceKlass java/lang/Process +instanceKlass org/jetbrains/kotlin/com/intellij/util/lang/JavaVersion +instanceKlass org/jetbrains/kotlin/com/intellij/util/ObjectUtils$Sentinel +instanceKlass org/jetbrains/kotlin/com/intellij/util/ObjectUtils +instanceKlass org/jetbrains/kotlin/com/intellij/util/ArrayUtilRt +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/CharArrayCharSequence +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/CharSequenceBackedByArray +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/text/CharSequenceWithStringHash +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/text/Strings +instanceKlass java/lang/reflect/AnnotatedType +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/SystemInfoRt +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/NotNullLazyValue +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/SystemInfo +instanceKlass org/jetbrains/kotlin/cli/common/environment/UtilKt +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Disposer$1 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentRefHashMap$$Lambda$30 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentRefHashMap$2 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentRefHashMap$HardKey +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentRefHashMap$KeyReference +instanceKlass java/util/DualPivotQuicksort +instanceKlass gnu/trove/PrimeFinder +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/RefHashMap$MyMap$1 +instanceKlass gnu/trove/TObjectHash$NULL +instanceKlass gnu/trove/TObjectObjectProcedure +instanceKlass gnu/trove/THash +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/RefHashMap$HardKey +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/RefHashMap$Key +instanceKlass gnu/trove/TObjectCanonicalHashingStrategy +instanceKlass gnu/trove/TObjectIdentityHashingStrategy +instanceKlass gnu/trove/TObjectHashingStrategy +instanceKlass gnu/trove/Equality +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/Reference2ObjectMap$FastEntrySet +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/ObjectSet +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/ObjectCollection +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/AbstractReference2ObjectFunction +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/Reference2ObjectMap +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/Reference2ObjectFunction +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/Function +instanceKlass java/lang/StrictMath +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/HashCommon +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/ObjectIterator +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/ReferenceSet +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/ReferenceCollection +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/ObjectIterable +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/Hash +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/ObjectTree +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Disposer +instanceKlass org/jetbrains/kotlin/progress/ProgressIndicatorAndCompilationCanceledStatus +instanceKlass org/jetbrains/kotlin/progress/CompilationCanceledStatus +instanceKlass org/jetbrains/kotlin/com/google/common/collect/LinkedHashMultimap$1 +instanceKlass java/util/stream/MatchOps$$Lambda$29 +instanceKlass java/util/stream/MatchOps$BooleanTerminalSink +instanceKlass java/util/stream/MatchOps$MatchOp +instanceKlass java/util/stream/MatchOps +instanceKlass org/jetbrains/kotlin/cli/common/messages/GroupingMessageCollector$$Lambda$28 +instanceKlass java/util/Spliterators$IteratorSpliterator +instanceKlass org/jetbrains/kotlin/utils/KotlinPathsFromBaseDirectory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Pair +instanceKlass java/util/regex/ASCII +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/text/StringUtil$$Lambda$27 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/text/StringUtil$$Lambda$26 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/text/StringUtil$$Lambda$25 +instanceKlass org/jetbrains/kotlin/com/intellij/util/NotNullFunction +instanceKlass org/jetbrains/kotlin/com/intellij/util/NullableFunction +instanceKlass org/jetbrains/kotlin/com/intellij/util/Function +instanceKlass javax/swing/text/html/HTMLEditorKit$ParserCallback +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/text/StringUtilRt +instanceKlass java/util/regex/CharPredicates$$Lambda$24 +instanceKlass java/util/regex/Pattern$CharPredicate$$Lambda$23 +instanceKlass java/util/regex/Pattern$$Lambda$22 +instanceKlass java/util/regex/CharPredicates$$Lambda$21 +instanceKlass java/util/regex/Pattern$CharPredicate$$Lambda$20 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/jetbrains/kotlin/com/intellij/util/io/URLUtil +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/application/PathManager +instanceKlass java/util/regex/Pattern$$Lambda$19 +instanceKlass java/util/regex/Pattern$BmpCharPredicate$$Lambda$18 +instanceKlass java/util/regex/Pattern$$Lambda$17 +instanceKlass java/util/regex/Pattern$BitClass$$Lambda$16 +instanceKlass org/jetbrains/kotlin/utils/PathUtil +instanceKlass org/jetbrains/kotlin/config/JVMConfigurationKeys +instanceKlass org/jetbrains/kotlin/cli/jvm/JvmArgumentsKt +instanceKlass org/jetbrains/kotlin/config/IncrementalCompilation +instanceKlass org/jetbrains/kotlin/config/CommonConfigurationKeysKt +instanceKlass org/jetbrains/kotlin/cli/common/arguments/JavaTypeEnhancementStateParser$Jsr305State +instanceKlass org/jetbrains/kotlin/cli/common/arguments/JavaTypeEnhancementStateParser +instanceKlass org/jetbrains/kotlin/config/JvmAnalysisFlags$Delegates$JvmDefaultModeDisabledByDefault +instanceKlass org/jetbrains/kotlin/utils/ReportLevel$Companion +instanceKlass org/jetbrains/kotlin/utils/JavaTypeEnhancementState$Companion +instanceKlass org/jetbrains/kotlin/utils/JavaTypeEnhancementState +instanceKlass org/jetbrains/kotlin/config/JvmAnalysisFlags$Delegates$JavaTypeEnhancementStateWarnByDefault +instanceKlass org/jetbrains/kotlin/config/JvmAnalysisFlags +instanceKlass org/jetbrains/kotlin/config/AnalysisFlag$Delegates$ConstraintSystemForOverloadResolution +instanceKlass org/jetbrains/kotlin/config/AnalysisFlag$Delegates$ApiModeDisabledByDefault +instanceKlass org/jetbrains/kotlin/config/AnalysisFlag$Delegates$ListOfStrings +instanceKlass org/jetbrains/kotlin/config/AnalysisFlag$Delegate +instanceKlass org/jetbrains/kotlin/config/AnalysisFlag$Delegates$Boolean +instanceKlass org/jetbrains/kotlin/config/AnalysisFlags +instanceKlass java/math/MutableBigInteger +instanceKlass org/jetbrains/kotlin/config/MavenComparableVersion$IntegerItem +instanceKlass org/jetbrains/kotlin/config/MavenComparableVersion$Item +instanceKlass org/jetbrains/kotlin/config/MavenComparableVersion +instanceKlass org/jetbrains/kotlin/config/ApiVersion$Companion +instanceKlass org/jetbrains/kotlin/config/ApiVersion +instanceKlass org/jetbrains/kotlin/config/LanguageVersionSettingsImpl$Companion +instanceKlass org/jetbrains/kotlin/config/LanguageVersionSettingsImpl +instanceKlass org/jetbrains/kotlin/config/LanguageVersion$Companion +instanceKlass org/jetbrains/kotlin/config/CommonConfigurationKeys +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentIntObjectHashMap$CollectionView +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentIntObjectHashMap$CounterCell +instanceKlass java/lang/reflect/AccessibleObject$$Lambda$15 +instanceKlass org/jetbrains/kotlin/com/intellij/util/ReflectionUtil$$Lambda$14 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger$$Lambda$13 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/diagnostic/Attachment +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger$DefaultFactory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger$Factory +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger +instanceKlass org/jetbrains/kotlin/com/intellij/util/ReflectionUtil +instanceKlass sun/misc/Unsafe +instanceKlass org/jetbrains/kotlin/com/intellij/util/concurrency/AtomicFieldUpdater +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentIntObjectHashMap$Node +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/IntObjectMap$Entry +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentIntObjectHashMap +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentIntKeyRefValueHashMap$IntReference +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Getter +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentIntKeyRefValueHashMap +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Condition +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentLongObjectMap +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentIntObjectMap +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentList +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ContainerUtil +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/IntObjectMap +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/Key +instanceKlass org/jetbrains/kotlin/config/CompilerConfigurationKey +instanceKlass org/jetbrains/kotlin/cli/common/CLIConfigurationKeys +instanceKlass org/jetbrains/kotlin/com/google/common/collect/AbstractMapEntry +instanceKlass org/jetbrains/kotlin/com/google/common/collect/LinkedHashMultimap$ValueSetLink +instanceKlass org/jetbrains/kotlin/com/google/common/collect/CollectPreconditions +instanceKlass org/jetbrains/kotlin/com/google/common/base/Preconditions +instanceKlass org/jetbrains/kotlin/com/google/common/collect/ImmutableMap +instanceKlass org/jetbrains/kotlin/com/google/common/collect/SortedMapDifference +instanceKlass org/jetbrains/kotlin/com/google/common/collect/MapDifference +instanceKlass org/jetbrains/kotlin/com/google/common/collect/BiMap +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Maps$EntryTransformer +instanceKlass org/jetbrains/kotlin/com/google/common/base/Converter +instanceKlass org/jetbrains/kotlin/com/google/common/collect/UnmodifiableIterator +instanceKlass java/util/NavigableSet +instanceKlass java/util/SortedSet +instanceKlass org/jetbrains/kotlin/com/google/common/base/Function +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Maps +instanceKlass jdk/internal/logger/DefaultLoggerFinder$1 +instanceKlass java/util/logging/Logger$SystemLoggerHelper$1 +instanceKlass java/util/logging/Logger$SystemLoggerHelper +instanceKlass java/util/logging/LogManager$4 +instanceKlass jdk/internal/logger/BootstrapLogger$BootstrapExecutors +instanceKlass jdk/internal/logger/BootstrapLogger$RedirectedLoggers +instanceKlass java/util/concurrent/CopyOnWriteArrayList$COWIterator +instanceKlass jdk/internal/logger/BootstrapLogger$DetectBackend$1 +instanceKlass jdk/internal/logger/BootstrapLogger$DetectBackend +instanceKlass jdk/internal/logger/BootstrapLogger +instanceKlass sun/util/logging/PlatformLogger$ConfigurableBridge +instanceKlass sun/util/logging/PlatformLogger$Bridge +instanceKlass java/lang/System$Logger +instanceKlass java/util/stream/Streams +instanceKlass java/util/stream/Streams$AbstractStreamBuilderImpl +instanceKlass java/util/stream/Stream$Builder +instanceKlass java/util/stream/Sink$ChainedReference +instanceKlass java/util/stream/FindOps$FindSink$OfRef$$Lambda$12 +instanceKlass java/util/stream/FindOps$FindSink$OfRef$$Lambda$11 +instanceKlass java/util/stream/FindOps$FindSink$OfRef$$Lambda$10 +instanceKlass java/util/stream/FindOps$FindSink$OfRef$$Lambda$9 +instanceKlass java/util/stream/FindOps$FindOp +instanceKlass java/util/stream/TerminalOp +instanceKlass java/util/stream/FindOps$FindSink +instanceKlass java/util/stream/TerminalSink +instanceKlass java/util/stream/Sink +instanceKlass java/util/stream/FindOps +instanceKlass java/util/logging/Level$KnownLevel$$Lambda$8 +instanceKlass java/util/ArrayList$ArrayListSpliterator +instanceKlass java/util/logging/Level$$Lambda$7 +instanceKlass java/util/Hashtable$Enumerator +instanceKlass java/util/Collections$3 +instanceKlass java/util/logging/LogManager$LoggerContext$1 +instanceKlass java/util/logging/LogManager$VisitedLoggers +instanceKlass java/util/function/Predicate +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass sun/invoke/util/ValueConversions$WrapperCache +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/MethodHandles$1 +instanceKlass java/lang/Byte$ByteCache +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/ClassValue$Version +instanceKlass java/lang/ClassValue$Identity +instanceKlass java/lang/ClassValue +instanceKlass java/lang/invoke/StringConcatFactory$Stringifiers +instanceKlass java/lang/StringConcatHelper +instanceKlass java/lang/invoke/StringConcatFactory$MethodHandleInlineCopyStrategy$3 +instanceKlass java/lang/invoke/StringConcatFactory$MethodHandleInlineCopyStrategy$2 +instanceKlass java/lang/invoke/StringConcatFactory$MethodHandleInlineCopyStrategy$1 +instanceKlass java/lang/invoke/StringConcatFactory$MethodHandleInlineCopyStrategy +instanceKlass java/lang/invoke/StringConcatFactory$RecipeElement +instanceKlass java/lang/invoke/StringConcatFactory$Recipe +instanceKlass java/lang/invoke/StringConcatFactory$1 +instanceKlass java/lang/invoke/StringConcatFactory +instanceKlass java/util/logging/LogManager$2 +instanceKlass java/lang/System$LoggerFinder +instanceKlass sun/security/util/SecurityConstants +instanceKlass java/security/AccessController$1 +instanceKlass java/util/logging/LogManager$LoggingProviderAccess +instanceKlass sun/util/logging/internal/LoggingProviderImpl$LogManagerAccess +instanceKlass java/lang/Shutdown$Lock +instanceKlass java/lang/Shutdown +instanceKlass java/lang/ApplicationShutdownHooks$1 +instanceKlass java/lang/ApplicationShutdownHooks +instanceKlass java/util/Collections$SynchronizedMap +instanceKlass java/util/logging/LogManager$LogNode +instanceKlass java/util/logging/LogManager$LoggerContext +instanceKlass java/util/logging/LogManager$1 +instanceKlass java/util/logging/LogManager +instanceKlass java/util/logging/Logger$ConfigurationData +instanceKlass java/util/logging/Logger$LoggerBundle +instanceKlass java/util/logging/Level +instanceKlass java/util/logging/Handler +instanceKlass java/util/logging/Logger +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Platform +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Multiset +instanceKlass org/jetbrains/kotlin/com/google/common/collect/AbstractMultimap +instanceKlass org/jetbrains/kotlin/com/google/common/collect/SetMultimap +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Multimap +instanceKlass org/jetbrains/kotlin/cli/common/messages/GroupingMessageCollector +instanceKlass org/jetbrains/kotlin/util/PerformanceCounter$Companion +instanceKlass org/jetbrains/kotlin/util/PerformanceCounter +instanceKlass org/jetbrains/kotlin/utils/SmartList$EmptyIterator +instanceKlass org/jetbrains/kotlin/cli/common/ArgumentsKt +instanceKlass org/jetbrains/kotlin/cli/common/messages/PrintingMessageCollector +instanceKlass java/util/StringJoiner +instanceKlass kotlin/reflect/KProperty1$Getter +instanceKlass kotlin/reflect/jvm/KTypesJvm +instanceKlass kotlin/reflect/jvm/internal/calls/CallerKt +instanceKlass kotlin/reflect/jvm/internal/calls/Caller$DefaultImpls +instanceKlass kotlin/reflect/jvm/internal/calls/BoundCaller +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/InlineClassesUtilsKt +instanceKlass kotlin/reflect/jvm/internal/calls/InlineClassAwareCallerKt +instanceKlass kotlin/reflect/jvm/internal/calls/CallerImpl$Companion +instanceKlass kotlin/reflect/jvm/internal/calls/CallerImpl +instanceKlass kotlin/reflect/jvm/internal/calls/Caller +instanceKlass kotlin/reflect/jvm/internal/KPropertyImplKt +instanceKlass kotlin/reflect/KMutableProperty1$Setter +instanceKlass kotlin/reflect/jvm/internal/impl/types/IntersectionTypeConstructor +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/IntersectionTypeConstructorMarker +instanceKlass kotlin/reflect/jvm/internal/impl/types/checker/NewTypeVariableConstructor +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/DefinitelyNotNullTypeMarker +instanceKlass kotlin/reflect/jvm/internal/impl/types/CustomTypeVariable +instanceKlass kotlin/reflect/jvm/internal/impl/types/SpecialTypesKt +instanceKlass kotlin/reflect/jvm/internal/KTypeImpl +instanceKlass kotlin/jvm/internal/KTypeBase +instanceKlass org/jetbrains/kotlin/com/intellij/util/xmlb/annotations/Transient +instanceKlass org/jetbrains/kotlin/cli/common/arguments/ParseCommandLineArgumentsKt$parsePreprocessedCommandLineArguments$ArgumentField +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$Storage +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/constants/KClassValue$Value +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/constants/KClassValue$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/constants/ClassLiteralValue +instanceKlass org/jetbrains/kotlin/cli/common/arguments/GradleOption +instanceKlass org/jetbrains/kotlin/cli/common/arguments/DeprecatedOption +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/annotations/AnnotationDescriptorImpl +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/annotations/AnnotationDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValueFactory +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl$loadAnnotation$1 +instanceKlass sun/reflect/annotation/AnnotationParser$$Lambda$6 +instanceKlass kotlin/annotation/MustBeDocumented +instanceKlass kotlin/reflect/jvm/internal/impl/SpecialJvmAnnotations +instanceKlass org/jetbrains/kotlin/cli/common/arguments/Argument +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1$MemberAnnotationVisitor +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$MethodAnnotationVisitor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/SignatureSerializer +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$loadAnnotationsAndInitializers$1 +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$MemberVisitor +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/MemberSignature +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmFlags +instanceKlass kotlin/reflect/jvm/internal/UtilKt +instanceKlass kotlin/reflect/jvm/internal/JvmFunctionSignature +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMemberSignature +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/ClassMapperLite +instanceKlass kotlin/reflect/jvm/internal/FunctionWithAllInvokes +instanceKlass kotlin/reflect/jvm/internal/JvmPropertySignature +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/ProtoBufUtilKt +instanceKlass jdk/internal/reflect/ClassDefiner$1 +instanceKlass jdk/internal/reflect/ClassDefiner +instanceKlass jdk/internal/reflect/MethodAccessorGenerator$1 +instanceKlass jdk/internal/reflect/Label$PatchInfo +instanceKlass jdk/internal/reflect/Label +instanceKlass jdk/internal/reflect/UTF8 +instanceKlass jdk/internal/reflect/ClassFileAssembler +instanceKlass jdk/internal/reflect/ByteVectorImpl +instanceKlass jdk/internal/reflect/ByteVector +instanceKlass jdk/internal/reflect/ByteVectorFactory +instanceKlass jdk/internal/reflect/AccessorGenerator +instanceKlass jdk/internal/reflect/ClassFileConstants +instanceKlass kotlin/reflect/jvm/internal/impl/types/FlexibleTypesKt +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/UtilsKt +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$7 +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$6 +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/VisibilityUtilKt +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$3 +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/components/DescriptorResolverUtils$1$1 +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/components/DescriptorResolverUtils +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProviderImpl +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/deserialization/AdditionalClassPartsProvider$None +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentDeclarationFilter$NoPlatformDependent +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInsLoaderImpl +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/BuiltInsLoader$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/BuiltInsLoader +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/DefaultBuiltIns$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/SuspendFunctionTypesKt +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/BuiltinSpecialPropertiesKt +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/BuiltinSpecialProperties +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/JvmAbi +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/PropertiesConventionUtilKt +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/receivers/AbstractReceiverValue +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaTypeParameter +instanceKlass sun/reflect/generics/reflectiveObjects/LazyReflectiveObjectGenerator +instanceKlass sun/reflect/generics/tree/TypeVariableSignature +instanceKlass org/jetbrains/kotlin/cli/common/arguments/DefaultValues +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/FunctionDescriptorImpl$CopyConfiguration +instanceKlass org/jetbrains/kotlin/utils/DescriptionAware +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinderKt +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedClassDescriptor$EnumEntryClassDescriptors +instanceKlass org/jetbrains/kotlin/config/AnalysisFlag +instanceKlass kotlin/reflect/jvm/internal/impl/utils/SmartSet$SingletonIterator +instanceKlass kotlin/jvm/internal/markers/KMutableIterator +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/descriptors/JavaCallableMemberDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/SpecialGenericSignatures$Companion$NameAndSignature +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/SpecialGenericSignatures$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/SpecialGenericSignatures +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$OverrideCompatibilityInfo +instanceKlass kotlin/reflect/jvm/internal/impl/types/AbstractTypeChecker +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/FlexibleTypeMarker +instanceKlass kotlin/reflect/jvm/internal/impl/types/KotlinTypeKt +instanceKlass kotlin/reflect/jvm/internal/impl/types/checker/ClassicTypeCheckerContext$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/types/AbstractTypeCheckerContext +instanceKlass kotlin/reflect/jvm/internal/impl/types/checker/ClassicTypeSystemContext +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/TypeSystemInferenceExtensionContext +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/TypeSystemCommonSuperTypesContext +instanceKlass kotlin/reflect/jvm/internal/impl/types/TypeSystemCommonBackendContext +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/TypeSystemContext +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/TypeSystemOptimizationContext +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/CloneableClassScope$Companion +instanceKlass org/jetbrains/kotlin/cli/common/messages/MessageCollector +instanceKlass org/jetbrains/kotlin/config/LanguageVersionSettings +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/SuspendFunctionTypeUtilKt +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Settings +instanceKlass java/util/TimSort +instanceKlass java/util/Arrays$LegacyMergeSort +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/MemberComparator$NameAndTypeMemberComparator +instanceKlass org/jetbrains/kotlin/cli/common/arguments/InternalArgument +instanceKlass java/util/Properties$LineReader +instanceKlass java/security/Security$1 +instanceKlass java/security/Security +instanceKlass sun/security/util/SecurityProperties +instanceKlass sun/security/util/FilePermCompat +instanceKlass java/io/FilePermission$1 +instanceKlass jdk/internal/misc/JavaIOFilePermissionAccess +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/DescriptorFactory +instanceKlass kotlin/collections/builders/ListBuilderKt +instanceKlass kotlin/collections/builders/MapBuilder$Companion +instanceKlass kotlin/collections/builders/MapBuilder +instanceKlass kotlin/jvm/internal/markers/KMutableMap +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/Visibilities +instanceKlass kotlin/reflect/jvm/internal/impl/types/DisjointKeysUnionTypeSubstitution$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/types/DescriptorSubstitutor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/PropertyDescriptorImpl$CopyConfiguration +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$4 +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$8 +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/TypeAliasConstructorDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor$DefaultImpls +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$5 +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/calls/inference/CapturedTypeConstructorKt +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/SubstitutingScope +instanceKlass kotlin/reflect/jvm/internal/impl/types/TypeSubstitutor +instanceKlass kotlin/reflect/jvm/internal/impl/types/TypeConstructorSubstitution$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/types/TypeSubstitution$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/types/TypeSubstitution +instanceKlass kotlin/reflect/jvm/internal/impl/types/TypeProjectionBase +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractTypeParameterDescriptor$2 +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractTypeParameterDescriptor$1 +instanceKlass kotlin/reflect/jvm/internal/impl/utils/SmartSet$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/OverridingStrategy +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/ValueParameterDescriptorImpl$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ValueParameterDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/receivers/ImplicitClassReceiver +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/receivers/ThisClassReceiver +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/receivers/ImplicitReceiver +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleAwareClassDescriptorKt +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/TypeParameterDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/TypeParameterMarker +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedCallableMemberDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedMemberDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DescriptorWithContainerSource +instanceKlass java/lang/reflect/ParameterizedType +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DescriptorUtilKt +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaPrimitiveType +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/types/JavaTypeAttributes +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/types/JavaTypeResolverKt +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/FakePureImplementationsProvider +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/components/JavaAnnotationMapper +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaAnnotationOwnerKt +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaAnnotationOwner$DefaultImpls +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaType$Factory +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaType +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaClassifierType +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaType +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/ListBasedJavaAnnotationOwner +instanceKlass kotlin/jvm/internal/SpreadBuilder +instanceKlass kotlin/collections/CollectionsKt___CollectionsKt$asSequence$$inlined$Sequence$1 +instanceKlass kotlin/sequences/FilteringSequence$iterator$1 +instanceKlass kotlin/sequences/TransformingSequence$iterator$1 +instanceKlass kotlin/sequences/TransformingSequence +instanceKlass kotlin/sequences/FilteringSequence +instanceKlass kotlin/sequences/EmptySequence +instanceKlass kotlin/sequences/DropTakeSequence +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/ClassDeclaredMemberIndex +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/DeclaredMemberIndex +instanceKlass kotlin/reflect/jvm/internal/impl/util/collectionUtils/ScopeUtilsKt +instanceKlass java/util/LinkedList$ListItr +instanceKlass kotlin/Triple +instanceKlass java/util/LinkedList$Node +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolverImpl$WhenMappings +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/Utf8 +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ProtoBasedClassDataFinder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolverImpl +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$ArgumentOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$QualifiedNameTable$QualifiedName$Kind$1 +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$QualifiedNameTable$QualifiedNameOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$QualifiedNameTableOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/LazyStringList +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/ProtocolStringList +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$StringTableOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$PackageFragmentOrBuilder +instanceKlass kotlin/collections/IntIterator +instanceKlass kotlin/internal/ProgressionUtilKt +instanceKlass kotlin/ranges/IntRange$Companion +instanceKlass kotlin/ranges/IntProgression$Companion +instanceKlass kotlin/ranges/IntProgression +instanceKlass kotlin/ranges/ClosedRange +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/builtins/BuiltInsBinaryVersion$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInsPackageFragmentImpl$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/BuiltInsPackageFragment +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotations +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotationsKt +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaModifierListOwner$DefaultImpls +instanceKlass java/lang/reflect/TypeVariable +instanceKlass sun/reflect/generics/tree/ClassSignature +instanceKlass sun/reflect/generics/tree/Signature +instanceKlass sun/reflect/generics/tree/FormalTypeParameter +instanceKlass sun/reflect/generics/repository/AbstractRepository +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaTypeParameterResolver +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory$RuntimeSourceElement +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElement +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/descriptors/JavaClassDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaTypeParameterListOwner +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaClassifier +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaNamedElement +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaModifierListOwner +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaModifierListOwner +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaAnnotationOwner +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$Request +instanceKlass kotlin/reflect/jvm/internal/impl/storage/SingleThreadValue +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/SignatureBuildingComponents +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsSignatures +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/TypeAliasDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedAnnotations +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/ProtoTypeTableUtilKt +instanceKlass kotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$Supertypes +instanceKlass kotlin/jvm/internal/CollectionToArray +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/DescriptorKindFilter$Companion$MaskToName +instanceKlass jdk/internal/reflect/UnsafeFieldAccessorFactory +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/DescriptorKindFilter$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/DescriptorKindFilter +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/ResolutionScope$DefaultImpls +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorVisitorEmptyBodies +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorVisitor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/TypeParameterUtilsKt +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EntryIterator +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtendableMessage$ExtensionWriter +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedMemberScope$OptimizedImplementation +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedMemberScope$Implementation +instanceKlass java/util/ArrayList$SubList$1 +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ProtoContainer +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/VersionSpecificBehaviorKt +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ProtoEnumFlagsUtilsKt$WhenMappings +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ProtoEnumFlagsUtilsKt +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ProtoEnumFlags$WhenMappings +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$MemberKind$1 +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$Kind$1 +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Modality$1 +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Visibility$1 +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/Flags$FlagField +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/Flags +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ProtoEnumFlags +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolver$WhenMappings +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/NameResolverUtilKt +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DeserializedDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeserializer +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/VersionRequirementTable$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/VersionRequirementTable +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/TypeTable +instanceKlass kotlin/collections/EmptyIterator +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer$ClassKey +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassData +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$DefaultImpls +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinarySourceElement +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedContainerSource +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$Argument$Projection$1 +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$ArgumentOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$Entry +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/FieldSet$1 +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/AbstractMessageLite$Builder +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$1 +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$StringTableTypes$Record$Operation$1 +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$StringTableTypes$RecordOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/WireFormat +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/CodedOutputStream +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$StringTableTypesOrBuilder +instanceKlass kotlin/collections/IndexedValue +instanceKlass kotlin/collections/IndexingIterator +instanceKlass kotlin/collections/IndexingIterable +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolver$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolver +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/UtfEncodingKt +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/BitEncoding +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder$Result +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor$CollectStringArrayAnnotationVisitor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassKt +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationArrayArgumentVisitor +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor$KotlinMetadataArgumentVisitor +instanceKlass java/lang/annotation/Documented +instanceKlass java/lang/Deprecated +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/jvm/JvmClassName +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/JvmAnnotationNames +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectAnnotationSource +instanceKlass java/lang/Class$AnnotationData +instanceKlass java/lang/annotation/Target +instanceKlass java/lang/reflect/Proxy$ProxyBuilder$1 +instanceKlass java/lang/reflect/ProxyGenerator$ExceptionTableEntry +instanceKlass java/lang/reflect/ProxyGenerator$PrimitiveTypeInfo +instanceKlass java/lang/reflect/ProxyGenerator$FieldInfo +instanceKlass java/lang/reflect/ProxyGenerator$ConstantPool$Entry +instanceKlass java/lang/reflect/ProxyGenerator$MethodInfo +instanceKlass java/lang/reflect/ProxyGenerator$ProxyMethod +instanceKlass java/lang/reflect/ProxyGenerator$ConstantPool +instanceKlass java/lang/reflect/ProxyGenerator +instanceKlass java/lang/reflect/Proxy$$Lambda$5 +instanceKlass java/lang/PublicMethods +instanceKlass java/lang/reflect/Proxy$ProxyBuilder +instanceKlass java/lang/reflect/Proxy$$Lambda$4 +instanceKlass java/lang/reflect/Proxy +instanceKlass sun/reflect/annotation/AnnotationInvocationHandler +instanceKlass java/lang/reflect/InvocationHandler +instanceKlass sun/reflect/annotation/AnnotationParser$1 +instanceKlass kotlin/annotation/Target +instanceKlass kotlin/annotation/Retention +instanceKlass java/lang/annotation/Inherited +instanceKlass java/lang/annotation/Retention +instanceKlass sun/reflect/annotation/ExceptionProxy +instanceKlass sun/reflect/annotation/AnnotationType$1 +instanceKlass sun/reflect/annotation/AnnotationType +instanceKlass java/lang/reflect/GenericArrayType +instanceKlass kotlin/Metadata +instanceKlass sun/reflect/generics/visitor/Reifier +instanceKlass sun/reflect/generics/visitor/TypeTreeVisitor +instanceKlass sun/reflect/generics/factory/CoreReflectionFactory +instanceKlass sun/reflect/generics/factory/GenericsFactory +instanceKlass sun/reflect/generics/scope/AbstractScope +instanceKlass sun/reflect/generics/scope/Scope +instanceKlass sun/reflect/generics/tree/ClassTypeSignature +instanceKlass sun/reflect/generics/tree/SimpleClassTypeSignature +instanceKlass sun/reflect/generics/tree/FieldTypeSignature +instanceKlass sun/reflect/generics/tree/BaseType +instanceKlass sun/reflect/generics/tree/TypeSignature +instanceKlass sun/reflect/generics/tree/ReturnType +instanceKlass sun/reflect/generics/tree/TypeArgument +instanceKlass sun/reflect/generics/tree/TypeTree +instanceKlass sun/reflect/generics/tree/Tree +instanceKlass sun/reflect/generics/parser/SignatureParser +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectClassStructure +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationArgumentVisitor +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationVisitor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass$Factory +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinderKt +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinderKt +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest +instanceKlass kotlin/reflect/jvm/internal/impl/incremental/UtilsKt +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope +instanceKlass kotlin/UnsafeLazyImpl +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/ContextKt +instanceKlass kotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaElement +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaAnnotationOwner +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/JavaElement +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProviderKt +instanceKlass java/util/Collections$1 +instanceKlass java/util/regex/IntHashSet +instanceKlass java/util/regex/Matcher +instanceKlass java/util/regex/MatchResult +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/AbstractScopeAdapter +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/ResolutionAnchorProviderKt +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/FindClassInModuleKt +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/PackagePartScopeCache +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/CompositePackageFragmentProvider +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependenciesImpl +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependencies +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/functions/BuiltInFictitiousFunctionClassFactory +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/deserialization/ClassDescriptorFactory +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer$ThrowException +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter$1 +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntryOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$Type$1 +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$ValueOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/builtins/BuiltInsProtoBuf +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/SerializerExtensionProtocol +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationAndConstantLoaderImpl +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializedClassDataFinder +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsPackageFragmentProvider$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider +instanceKlass kotlin/Unit +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/jvm/JavaDescriptorResolver +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer$None +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite$ObjectIntPair +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$PackageOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTableOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ClassOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter$Variance$1 +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/Internal$EnumLiteMap +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameterOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$AnnotationOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignatureOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignatureOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameterOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$PropertyOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ContractOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTableOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$FunctionOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/Internal$EnumLite +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtensionDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension +instanceKlass java/lang/Long$LongCache +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignatureOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/ByteString$ByteIterator +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/ByteString +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$2 +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$1 +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/LazyFieldLite +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/FieldSet +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/AbstractParser +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/MessageLite$Builder +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/Parser +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/FieldSet$FieldDescriptorLite +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/AbstractMessageLite +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ConstructorOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtendableMessageOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/MessageLite +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/MessageLiteOrBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmProtoBufUtil +instanceKlass kotlin/reflect/jvm/internal/impl/utils/WrappedValues$ThrowableWrapper +instanceKlass kotlin/reflect/jvm/internal/impl/utils/WrappedValues$1 +instanceKlass kotlin/reflect/jvm/internal/impl/utils/WrappedValues +instanceKlass kotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/FieldDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/PropertySetterDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/PropertyGetterDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/types/ErrorUtils$2 +instanceKlass kotlin/reflect/jvm/internal/impl/types/ErrorUtils$ErrorScope +instanceKlass kotlin/reflect/jvm/internal/impl/util/ModuleVisibilityHelper$EMPTY +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$12 +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$11 +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$10 +instanceKlass kotlin/reflect/jvm/internal/impl/util/ModuleVisibilityHelper +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/Visibility +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/receivers/ReceiverValue +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/FunctionDescriptor$CopyBuilder +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ClassConstructorDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ConstructorDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/types/ErrorUtils$1 +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/SimpleFunctionDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/PropertyDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/VariableDescriptorWithAccessors +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/VariableDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/types/ErrorUtils +instanceKlass kotlin/reflect/jvm/internal/impl/types/TypeProjection +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/TypeArgumentMarker +instanceKlass kotlin/reflect/jvm/internal/impl/types/TypeUtils +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1$1 +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/PackageViewDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils +instanceKlass kotlin/collections/EmptySet +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScopeImpl +instanceKlass kotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ParameterDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ValueDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$3 +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$2 +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1 +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/Modality$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleAwareClassDescriptor$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/types/TypeConstructor +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/TypeConstructorMarker +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/scopes/ResolutionScope +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleAwareClassDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptorWithTypeParameters +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/SourceElement$1 +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/SourceElement +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ClassOrPackageFragmentDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMapper +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer +instanceKlass kotlin/reflect/jvm/internal/impl/storage/StorageKt +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/JavaFlexibleTypeDeserializer +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings$Default +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion$DEFAULT$1 +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/constants/ConstantValue +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationDeserializer +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationAndConstantLoader +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/JavaClassDataFinder +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDataFinder +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/types/JavaTypeResolver +instanceKlass kotlin/InitializedLazyImpl +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver$EMPTY +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProviderOptimized +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$1 +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/JavaIncompatibilityRulesOverridabilityCondition$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/JavaIncompatibilityRulesOverridabilityCondition +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/ErasedOverridabilityCondition +instanceKlass java/util/ServiceLoader$ProviderImpl +instanceKlass java/util/ServiceLoader$Provider +instanceKlass java/util/ServiceLoader$1 +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/FieldOverridabilityCondition +instanceKlass sun/net/www/protocol/jar/URLJarFileCallBack +instanceKlass sun/net/www/MessageHeader +instanceKlass sun/net/www/protocol/jar/JarFileFactory +instanceKlass sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController +instanceKlass java/net/URLConnection +instanceKlass jdk/internal/loader/URLClassPath$1 +instanceKlass java/lang/CompoundEnumeration +instanceKlass jdk/internal/loader/BuiltinClassLoader$1 +instanceKlass java/util/Collections$EmptyEnumeration +instanceKlass java/util/Collections$EmptyIterator +instanceKlass jdk/internal/jimage/ImageLocation +instanceKlass jdk/internal/jimage/decompressor/Decompressor +instanceKlass jdk/internal/jimage/ImageStringsReader +instanceKlass jdk/internal/jimage/ImageStrings +instanceKlass jdk/internal/jimage/ImageHeader +instanceKlass jdk/internal/jimage/NativeImageBuffer$1 +instanceKlass jdk/internal/jimage/NativeImageBuffer +instanceKlass jdk/internal/jimage/BasicImageReader$1 +instanceKlass jdk/internal/jimage/BasicImageReader +instanceKlass jdk/internal/jimage/ImageReader +instanceKlass jdk/internal/jimage/ImageReaderFactory$1 +instanceKlass java/nio/file/Paths +instanceKlass jdk/internal/jimage/ImageReaderFactory +instanceKlass jdk/internal/module/SystemModuleFinders$SystemImage +instanceKlass jdk/internal/module/SystemModuleFinders$SystemModuleReader +instanceKlass java/lang/module/ModuleReader +instanceKlass jdk/internal/loader/BuiltinClassLoader$5 +instanceKlass jdk/internal/loader/BuiltinClassLoader$2 +instanceKlass jdk/internal/module/Resources +instanceKlass java/util/ServiceLoader$3 +instanceKlass java/util/ServiceLoader$2 +instanceKlass java/util/ServiceLoader$LazyClassPathLookupIterator +instanceKlass java/lang/ModuleLayer$$Lambda$3 +instanceKlass java/lang/WeakPairMap$Pair$Lookup +instanceKlass java/lang/WeakPairMap$Pair +instanceKlass java/lang/WeakPairMap +instanceKlass java/lang/Module$ReflectionData +instanceKlass java/util/Spliterators$1Adapter +instanceKlass java/util/function/Consumer +instanceKlass sun/reflect/annotation/AnnotationParser +instanceKlass java/util/stream/StreamOpFlag$MaskBuilder +instanceKlass java/util/stream/PipelineHelper +instanceKlass java/util/stream/Stream +instanceKlass java/util/stream/BaseStream +instanceKlass java/util/stream/StreamSupport +instanceKlass java/util/Spliterators$ArraySpliterator +instanceKlass java/util/Spliterator$OfDouble +instanceKlass java/util/Spliterator$OfLong +instanceKlass java/util/Spliterator$OfInt +instanceKlass java/util/Spliterator$OfPrimitive +instanceKlass java/util/Spliterators$EmptySpliterator +instanceKlass java/util/Spliterator +instanceKlass java/util/Spliterators +instanceKlass jdk/internal/loader/AbstractClassLoaderValue$Memoizer +instanceKlass java/util/ServiceLoader$ModuleServicesLookupIterator +instanceKlass java/util/ServiceLoader +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/ExternalOverridabilityCondition +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/PropertyAccessorDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/VariableAccessorDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/FunctionDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/MemberDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/CallableDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/Substitutable +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorWithVisibility +instanceKlass kotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeChecker$TypeConstructorEquality +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/OverridingUtil +instanceKlass kotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner +instanceKlass kotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeCheckerImpl +instanceKlass kotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker +instanceKlass kotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeChecker +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker$Default +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings$Default +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/JavaTypeEnhancement +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/SignatureEnhancement +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes$ClassLookup +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes +instanceKlass kotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker$DO_NOTHING +instanceKlass kotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker$EMPTY +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory +instanceKlass kotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction$1 +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolverImpl +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator$DoNothing +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache$1 +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeErrorReporter +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator$1 +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinder +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents +instanceKlass kotlin/reflect/jvm/internal/impl/utils/ReportLevel$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/utils/JavaTypeEnhancementState$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/utils/JavaTypeEnhancementState +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/AnnotationTypeQualifierResolver +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider$Empty +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleDataKt +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/SingleModuleClassResolver +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/ModuleClassResolver +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion +instanceKlass kotlin/ranges/RangesKt__RangesKt +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInsResourceLoader +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinder +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/KotlinMetadataFinder +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$4 +instanceKlass kotlin/SynchronizedLazyImpl +instanceKlass kotlin/reflect/jvm/internal/impl/types/checker/Ref +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ModuleCapability +instanceKlass kotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefinerKt +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion$EMPTY$1 +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations +instanceKlass kotlin/collections/EmptyMap +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/annotations/AnnotatedImpl +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$WhenMappings +instanceKlass kotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunction +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$3 +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$2 +instanceKlass kotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValue +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$1 +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/TypeArgumentListMarker +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/SimpleTypeMarker +instanceKlass kotlin/reflect/jvm/internal/impl/types/KotlinType +instanceKlass kotlin/reflect/jvm/internal/impl/types/model/KotlinTypeMarker +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/deserialization/AdditionalClassPartsProvider +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorNonRoot +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorWithSource +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentDeclarationFilter +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotated +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/Named +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns +instanceKlass java/util/concurrent/locks/AbstractQueuedSynchronizer$Node +instanceKlass kotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock +instanceKlass kotlin/reflect/jvm/internal/impl/storage/SimpleLock$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/storage/EmptySimpleLock +instanceKlass kotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy$1 +instanceKlass kotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy +instanceKlass kotlin/reflect/jvm/internal/impl/storage/NullableLazyValue +instanceKlass kotlin/reflect/jvm/internal/impl/storage/CacheWithNullableValues +instanceKlass kotlin/reflect/jvm/internal/impl/storage/CacheWithNotNullValues +instanceKlass kotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNotNull +instanceKlass kotlin/reflect/jvm/internal/impl/storage/NotNullLazyValue +instanceKlass kotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNullable +instanceKlass kotlin/reflect/jvm/internal/impl/storage/SimpleLock +instanceKlass kotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager +instanceKlass kotlin/reflect/jvm/internal/impl/storage/StorageManager +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData +instanceKlass kotlin/reflect/jvm/internal/WeakClassLoaderBox +instanceKlass kotlin/reflect/jvm/internal/ModuleByClassLoaderKt +instanceKlass kotlin/reflect/jvm/internal/impl/name/SpecialNames +instanceKlass java/util/LinkedHashMap$LinkedHashIterator +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping +instanceKlass java/util/EnumMap$1 +instanceKlass kotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt +instanceKlass kotlin/reflect/jvm/internal/impl/utils/CollectionsKt +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$Companion +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping +instanceKlass kotlin/_Assertions +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/functions/FunctionClassKind$Companion +instanceKlass kotlin/collections/SetsKt__SetsJVMKt +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/StandardNames +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap +instanceKlass kotlin/jvm/functions/Function22 +instanceKlass kotlin/jvm/functions/Function21 +instanceKlass kotlin/jvm/functions/Function20 +instanceKlass kotlin/jvm/functions/Function19 +instanceKlass kotlin/jvm/functions/Function18 +instanceKlass kotlin/jvm/functions/Function17 +instanceKlass kotlin/jvm/functions/Function16 +instanceKlass kotlin/jvm/functions/Function15 +instanceKlass kotlin/jvm/functions/Function14 +instanceKlass kotlin/jvm/functions/Function13 +instanceKlass kotlin/jvm/functions/Function12 +instanceKlass kotlin/jvm/functions/Function11 +instanceKlass kotlin/jvm/functions/Function10 +instanceKlass kotlin/jvm/functions/Function9 +instanceKlass kotlin/jvm/functions/Function8 +instanceKlass kotlin/jvm/functions/Function7 +instanceKlass kotlin/jvm/functions/Function6 +instanceKlass kotlin/jvm/functions/Function5 +instanceKlass kotlin/jvm/functions/Function4 +instanceKlass kotlin/jvm/functions/Function3 +instanceKlass kotlin/collections/MapsKt__MapWithDefaultKt +instanceKlass kotlin/Pair +instanceKlass kotlin/TuplesKt +instanceKlass kotlin/jvm/JvmClassMappingKt +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt +instanceKlass kotlin/reflect/jvm/internal/impl/name/ClassId +instanceKlass kotlin/reflect/jvm/internal/impl/name/FqNameUnsafe$1 +instanceKlass kotlin/reflect/jvm/internal/impl/name/Name +instanceKlass kotlin/reflect/jvm/internal/impl/name/FqNameUnsafe +instanceKlass kotlin/reflect/jvm/internal/impl/name/FqName +instanceKlass kotlin/reflect/jvm/internal/RuntimeTypeMapper +instanceKlass kotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data +instanceKlass kotlin/reflect/full/KClasses +instanceKlass java/io/FileInputStream$1 +instanceKlass kotlin/io/CloseableKt +instanceKlass kotlin/text/CharsKt__CharJVMKt +instanceKlass java/lang/Character$CharacterCache +instanceKlass java/nio/charset/CoderResult +instanceKlass kotlin/sequences/GeneratorSequence$iterator$1 +instanceKlass java/lang/invoke/VarHandle$AccessDescriptor +instanceKlass java/util/concurrent/atomic/AtomicReference +instanceKlass kotlin/sequences/ConstrainedOnceSequence +instanceKlass kotlin/sequences/GeneratorSequence +instanceKlass kotlin/sequences/Sequence +instanceKlass kotlin/sequences/SequencesKt__SequenceBuilderKt +instanceKlass java/io/Reader +instanceKlass java/lang/Readable +instanceKlass kotlin/text/Charsets +instanceKlass org/jetbrains/kotlin/cli/common/arguments/PreprocessCommandLineArgumentsKt +instanceKlass org/jetbrains/kotlin/cli/common/arguments/ArgumentParseErrors +instanceKlass org/jetbrains/kotlin/cli/common/arguments/ParseCommandLineArgumentsKt +instanceKlass kotlin/collections/ArraysUtilJVM +instanceKlass kotlin/collections/ArraysKt__ArraysJVMKt +instanceKlass java/util/TreeMap$Entry +instanceKlass java/lang/ProcessEnvironment$CheckedEntry +instanceKlass java/lang/ProcessEnvironment$CheckedEntrySet$1 +instanceKlass java/util/NavigableMap +instanceKlass java/util/SortedMap +instanceKlass java/lang/ProcessEnvironment$EntryComparator +instanceKlass java/lang/ProcessEnvironment$NameComparator +instanceKlass org/jetbrains/kotlin/config/JvmStringConcat$Companion +instanceKlass org/jetbrains/kotlin/config/JvmDefaultMode$Companion +instanceKlass org/jetbrains/kotlin/config/JVMAssertionsMode$Companion +instanceKlass org/jetbrains/kotlin/config/JvmTarget$Companion +instanceKlass org/jetbrains/kotlin/platform/TargetPlatformVersion +instanceKlass org/jetbrains/kotlin/config/ExplicitApiMode$Companion +instanceKlass kotlin/collections/EmptyList +instanceKlass kotlin/jvm/internal/markers/KMappedMarker +instanceKlass kotlin/collections/CollectionsKt__CollectionsJVMKt +instanceKlass org/jetbrains/kotlin/cli/common/arguments/Freezable$FreezableVar +instanceKlass kotlin/properties/ReadWriteProperty +instanceKlass kotlin/properties/ReadOnlyProperty +instanceKlass org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments$Companion +instanceKlass org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments$Companion +instanceKlass org/jetbrains/kotlin/cli/common/arguments/CommonToolArguments$Companion +instanceKlass kotlin/UNINITIALIZED_VALUE +instanceKlass sun/reflect/misc/ReflectUtil +instanceKlass java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl$1 +instanceKlass java/util/concurrent/atomic/AtomicReferenceFieldUpdater +instanceKlass kotlin/SafePublicationLazyImpl$Companion +instanceKlass kotlin/SafePublicationLazyImpl +instanceKlass kotlin/Lazy +instanceKlass kotlin/LazyKt$WhenMappings +instanceKlass kotlin/LazyKt__LazyJVMKt +instanceKlass kotlin/reflect/jvm/internal/KPropertyImpl$Companion +instanceKlass kotlin/reflect/jvm/internal/KCallableImpl +instanceKlass kotlin/reflect/jvm/internal/pcollections/MapEntry +instanceKlass kotlin/reflect/jvm/internal/ReflectProperties$Val$1 +instanceKlass kotlin/reflect/jvm/internal/ReflectProperties$Val +instanceKlass kotlin/reflect/jvm/internal/ReflectProperties +instanceKlass java/util/regex/Pattern$TreeInfo +instanceKlass java/util/regex/Pattern$$Lambda$2 +instanceKlass jdk/internal/org/objectweb/asm/FieldVisitor +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/InvokerBytecodeGenerator$CpPatch +instanceKlass java/lang/invoke/LambdaFormBuffer +instanceKlass java/lang/invoke/LambdaFormEditor +instanceKlass java/lang/invoke/DelegatingMethodHandle$Holder +instanceKlass sun/invoke/util/Wrapper$1 +instanceKlass java/lang/invoke/DirectMethodHandle$1 +instanceKlass sun/invoke/empty/Empty +instanceKlass sun/invoke/util/VerifyType +instanceKlass java/lang/invoke/ClassSpecializer$Factory +instanceKlass java/lang/invoke/ClassSpecializer$SpeciesData +instanceKlass java/lang/invoke/ClassSpecializer$1 +instanceKlass java/lang/invoke/ClassSpecializer +instanceKlass java/lang/invoke/InnerClassLambdaMetafactory$1 +instanceKlass java/util/regex/CharPredicates$$Lambda$1 +instanceKlass jdk/internal/org/objectweb/asm/AnnotationVisitor +instanceKlass jdk/internal/org/objectweb/asm/Frame +instanceKlass jdk/internal/org/objectweb/asm/Label +instanceKlass jdk/internal/org/objectweb/asm/MethodVisitor +instanceKlass jdk/internal/org/objectweb/asm/Item +instanceKlass jdk/internal/org/objectweb/asm/ByteVector +instanceKlass jdk/internal/org/objectweb/asm/ClassVisitor +instanceKlass sun/invoke/util/BytecodeDescriptor +instanceKlass java/lang/invoke/InfoFromMemberName +instanceKlass java/lang/invoke/MethodHandleInfo +instanceKlass sun/security/action/GetBooleanAction +instanceKlass jdk/internal/org/objectweb/asm/Type +instanceKlass java/lang/invoke/AbstractValidatingLambdaMetafactory +instanceKlass java/lang/invoke/MethodHandleImpl$1 +instanceKlass jdk/internal/misc/JavaLangInvokeAccess +instanceKlass java/lang/invoke/Invokers$Holder +instanceKlass java/lang/invoke/BootstrapMethodInvoker +instanceKlass java/util/regex/Pattern$BmpCharPredicate +instanceKlass java/util/regex/Pattern$CharPredicate +instanceKlass java/lang/invoke/InvokerBytecodeGenerator$2 +instanceKlass java/lang/invoke/InvokerBytecodeGenerator +instanceKlass java/lang/invoke/LambdaForm$Holder +instanceKlass java/lang/invoke/LambdaForm$Name +instanceKlass java/lang/invoke/Invokers +instanceKlass java/lang/invoke/MethodHandleImpl +instanceKlass sun/invoke/util/ValueConversions +instanceKlass java/lang/invoke/DirectMethodHandle$Holder +instanceKlass java/lang/invoke/LambdaForm$NamedFunction +instanceKlass java/lang/invoke/LambdaMetafactory +instanceKlass java/util/regex/CharPredicates +instanceKlass java/util/regex/Pattern$Node +instanceKlass java/util/regex/Pattern +instanceKlass kotlin/text/Regex$Companion +instanceKlass kotlin/text/Regex +instanceKlass kotlin/jvm/internal/DefaultConstructorMarker +instanceKlass kotlin/reflect/jvm/internal/KDeclarationContainerImpl$Companion +instanceKlass kotlin/reflect/jvm/internal/KTypeParameterOwnerImpl +instanceKlass kotlin/reflect/jvm/internal/KClassifierImpl +instanceKlass kotlin/reflect/jvm/internal/pcollections/ConsPStack +instanceKlass kotlin/reflect/jvm/internal/pcollections/IntTree +instanceKlass kotlin/reflect/jvm/internal/pcollections/IntTreePMap +instanceKlass kotlin/reflect/jvm/internal/pcollections/HashPMap +instanceKlass kotlin/reflect/jvm/internal/KClassCacheKt +instanceKlass kotlin/reflect/jvm/internal/KDeclarationContainerImpl +instanceKlass kotlin/jvm/internal/ClassBasedDeclarationContainer +instanceKlass kotlin/reflect/KTypeParameter +instanceKlass kotlin/reflect/KMutableProperty2 +instanceKlass kotlin/reflect/KProperty2 +instanceKlass kotlin/reflect/KType +instanceKlass kotlin/reflect/KMutableProperty0 +instanceKlass kotlin/reflect/KProperty0 +instanceKlass kotlin/jvm/functions/Function0 +instanceKlass kotlin/reflect/KClass +instanceKlass kotlin/jvm/internal/ReflectionFactory +instanceKlass kotlin/reflect/KClassifier +instanceKlass kotlin/jvm/internal/Reflection +instanceKlass kotlin/jvm/internal/CallableReference$NoReceiver +instanceKlass kotlin/reflect/KMutableProperty$Setter +instanceKlass kotlin/reflect/KProperty$Getter +instanceKlass kotlin/reflect/KFunction +instanceKlass kotlin/reflect/KProperty$Accessor +instanceKlass kotlin/reflect/KDeclarationContainer +instanceKlass kotlin/jvm/internal/CallableReference +instanceKlass kotlin/reflect/KMutableProperty1 +instanceKlass kotlin/reflect/KMutableProperty +instanceKlass kotlin/reflect/KProperty1 +instanceKlass kotlin/reflect/KProperty +instanceKlass kotlin/reflect/KCallable +instanceKlass kotlin/reflect/KAnnotatedElement +instanceKlass org/jetbrains/kotlin/config/Services$Builder +instanceKlass org/jetbrains/kotlin/config/Services$Companion +instanceKlass org/jetbrains/kotlin/cli/common/messages/GradleStyleMessageRenderer +instanceKlass java/lang/Class$3 +instanceKlass kotlin/text/StringsKt__AppendableKt +instanceKlass org/jetbrains/kotlin/cli/common/PropertiesKt +instanceKlass org/jetbrains/kotlin/cli/common/messages/PlainTextMessageRenderer +instanceKlass org/jetbrains/kotlin/cli/common/messages/XmlMessageRenderer +instanceKlass org/jetbrains/kotlin/cli/common/messages/MessageRenderer +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/CompatKt +instanceKlass kotlin/jvm/functions/Function2 +instanceKlass kotlin/jvm/internal/Lambda +instanceKlass kotlin/jvm/internal/FunctionBase +instanceKlass kotlin/jvm/functions/Function1 +instanceKlass kotlin/Function +instanceKlass org/jetbrains/kotlin/cli/common/CompilerSystemProperties$Companion +instanceKlass kotlin/jvm/internal/Intrinsics +instanceKlass org/jetbrains/kotlin/cli/jvm/K2JVMCompiler$Companion +instanceKlass org/jetbrains/kotlin/cli/common/CLITool$Companion +instanceKlass java/lang/PublicMethods$Key +instanceKlass java/lang/PublicMethods$MethodList +instanceKlass org/jetbrains/kotlin/utils/KotlinPaths +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/Disposable +instanceKlass org/jetbrains/kotlin/cli/common/CommonCompilerPerformanceManager +instanceKlass org/jetbrains/kotlin/config/Services +instanceKlass org/jetbrains/kotlin/cli/common/arguments/Freezable +instanceKlass org/jetbrains/kotlin/config/CompilerConfiguration +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/diagnostic/ExceptionWithAttachments +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/diagnostic/ControlFlowException +instanceKlass org/jetbrains/kotlin/cli/common/CLITool +instanceKlass sun/security/util/Debug +instanceKlass java/security/SecureClassLoader$DebugHolder +instanceKlass java/security/Permissions$1 +instanceKlass java/security/PermissionCollection +instanceKlass java/security/SecureClassLoader$1 +instanceKlass java/security/SecureClassLoader$CodeSourceKey +instanceKlass sun/nio/ByteBuffered +instanceKlass java/lang/Package$VersionInfo +instanceKlass java/lang/NamedPackage +instanceKlass java/util/jar/Attributes$Name +instanceKlass java/util/jar/Attributes +instanceKlass jdk/internal/loader/Resource +instanceKlass java/util/zip/ZipFile$InflaterCleanupAction +instanceKlass java/util/zip/Inflater$InflaterZStreamRef +instanceKlass java/util/zip/Inflater +instanceKlass java/util/zip/ZipEntry +instanceKlass java/util/jar/JarFile$1 +instanceKlass jdk/internal/util/jar/JarIndex +instanceKlass java/nio/Bits$1 +instanceKlass jdk/internal/misc/JavaNioAccess$BufferPool +instanceKlass java/nio/Bits +instanceKlass sun/nio/ch/DirectBuffer +instanceKlass jdk/internal/perf/PerfCounter$CoreCounters +instanceKlass jdk/internal/perf/Perf +instanceKlass jdk/internal/perf/Perf$GetPerfAction +instanceKlass jdk/internal/perf/PerfCounter +instanceKlass java/util/zip/ZipUtils +instanceKlass java/util/zip/ZipFile$Source$End +instanceKlass sun/invoke/util/Wrapper$Format +instanceKlass java/lang/invoke/MethodTypeForm +instanceKlass java/lang/invoke/MethodType$ConcurrentWeakInternSet +instanceKlass java/lang/Void +instanceKlass java/lang/invoke/VarForm +instanceKlass java/lang/invoke/VarHandleGuards +instanceKlass jdk/internal/util/Preconditions$1 +instanceKlass java/util/function/BiFunction +instanceKlass java/lang/invoke/VarHandle$1 +instanceKlass java/lang/invoke/VarHandles +instanceKlass sun/invoke/util/VerifyAccess +instanceKlass java/lang/invoke/MethodHandles$Lookup +instanceKlass java/security/Permission +instanceKlass java/security/Guard +instanceKlass java/lang/invoke/MemberName$Factory +instanceKlass java/lang/invoke/MethodHandles +instanceKlass java/util/concurrent/atomic/AtomicBoolean +instanceKlass java/io/RandomAccessFile$2 +instanceKlass jdk/internal/misc/JavaIORandomAccessFileAccess +instanceKlass java/io/RandomAccessFile +instanceKlass java/io/DataInput +instanceKlass java/io/DataOutput +instanceKlass java/nio/file/attribute/FileTime +instanceKlass sun/nio/fs/WindowsNativeDispatcher$CompletionStatus +instanceKlass sun/nio/fs/WindowsNativeDispatcher$AclInformation +instanceKlass sun/nio/fs/WindowsNativeDispatcher$Account +instanceKlass sun/nio/fs/WindowsNativeDispatcher$DiskFreeSpace +instanceKlass sun/nio/fs/WindowsNativeDispatcher$VolumeInformation +instanceKlass sun/nio/fs/WindowsNativeDispatcher$QueryDirectoryInformation +instanceKlass sun/nio/fs/WindowsNativeDispatcher$FirstStream +instanceKlass sun/nio/fs/WindowsNativeDispatcher$FirstFile +instanceKlass java/util/Enumeration +instanceKlass java/util/ArrayDeque$DeqIterator +instanceKlass java/lang/ClassLoader$NativeLibrary +instanceKlass java/lang/ClassLoader$2 +instanceKlass sun/nio/fs/WindowsNativeDispatcher$1 +instanceKlass sun/nio/fs/WindowsNativeDispatcher +instanceKlass sun/nio/fs/NativeBuffer$Deallocator +instanceKlass sun/nio/fs/NativeBuffer +instanceKlass sun/nio/fs/NativeBuffers +instanceKlass sun/nio/fs/WindowsFileAttributes +instanceKlass java/nio/file/attribute/DosFileAttributes +instanceKlass sun/nio/fs/AbstractBasicFileAttributeView +instanceKlass sun/nio/fs/DynamicFileAttributeView +instanceKlass sun/nio/fs/WindowsFileAttributeViews +instanceKlass sun/nio/fs/Util +instanceKlass java/nio/file/attribute/BasicFileAttributeView +instanceKlass java/nio/file/attribute/FileAttributeView +instanceKlass java/nio/file/attribute/AttributeView +instanceKlass java/nio/file/Files +instanceKlass java/nio/file/CopyOption +instanceKlass java/nio/file/attribute/BasicFileAttributes +instanceKlass sun/nio/fs/WindowsPath +instanceKlass java/nio/file/Path +instanceKlass java/nio/file/Watchable +instanceKlass java/net/URI$Parser +instanceKlass sun/nio/fs/WindowsPathParser$Result +instanceKlass sun/nio/fs/WindowsPathParser +instanceKlass java/util/Arrays$ArrayItr +instanceKlass java/nio/file/FileSystem +instanceKlass java/nio/file/OpenOption +instanceKlass java/nio/file/spi/FileSystemProvider +instanceKlass sun/nio/fs/DefaultFileSystemProvider +instanceKlass java/nio/file/FileSystems$DefaultFileSystemHolder$1 +instanceKlass java/nio/file/FileSystems$DefaultFileSystemHolder +instanceKlass java/nio/file/FileSystems +instanceKlass java/util/zip/ZipFile$Source$Key +instanceKlass java/util/zip/ZipFile$Source +instanceKlass jdk/internal/misc/InnocuousThread$2 +instanceKlass jdk/internal/misc/InnocuousThread$3 +instanceKlass jdk/internal/ref/CleanerFactory$1$1 +instanceKlass java/lang/ref/Cleaner$Cleanable +instanceKlass jdk/internal/ref/CleanerImpl +instanceKlass java/lang/ref/Cleaner$1 +instanceKlass java/lang/ref/Cleaner +instanceKlass jdk/internal/ref/CleanerFactory$1 +instanceKlass java/util/concurrent/ThreadFactory +instanceKlass jdk/internal/ref/CleanerFactory +instanceKlass java/util/zip/ZipFile$CleanableResource +instanceKlass java/util/zip/ZipCoder +instanceKlass java/lang/Runtime$Version +instanceKlass java/util/jar/JavaUtilJarAccessImpl +instanceKlass jdk/internal/misc/JavaUtilJarAccess +instanceKlass jdk/internal/loader/FileURLMapper +instanceKlass jdk/internal/loader/URLClassPath$JarLoader$1 +instanceKlass java/util/zip/ZipFile$1 +instanceKlass jdk/internal/misc/JavaUtilZipFileAccess +instanceKlass java/util/zip/ZipFile +instanceKlass java/util/zip/ZipConstants +instanceKlass jdk/internal/loader/URLClassPath$Loader +instanceKlass jdk/internal/loader/URLClassPath$3 +instanceKlass java/security/PrivilegedExceptionAction +instanceKlass sun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar +instanceKlass sun/util/locale/InternalLocaleBuilder +instanceKlass sun/util/locale/LocaleUtils +instanceKlass sun/util/locale/BaseLocale$Key +instanceKlass sun/util/locale/BaseLocale +instanceKlass sun/util/locale/LocaleObjectCache +instanceKlass java/util/Locale +instanceKlass sun/net/util/URLUtil +instanceKlass java/lang/StringCoding$Result +instanceKlass java/nio/charset/CharsetDecoder +instanceKlass sun/nio/cs/ArrayDecoder +instanceKlass java/lang/StringCoding$StringDecoder +instanceKlass java/lang/ThreadLocal$ThreadLocalMap +instanceKlass java/lang/StringCoding +instanceKlass sun/launcher/LauncherHelper +instanceKlass jdk/internal/module/IllegalAccessLogger +instanceKlass jdk/internal/module/ModuleBootstrap$2 +instanceKlass jdk/internal/module/IllegalAccessLogger$Builder +instanceKlass java/lang/ModuleLayer$Controller +instanceKlass java/util/HashMap$HashIterator +instanceKlass jdk/internal/module/ServicesCatalog$ServiceProvider +instanceKlass java/util/concurrent/CopyOnWriteArrayList +instanceKlass java/util/Collections$UnmodifiableCollection$1 +instanceKlass java/util/Collections$UnmodifiableCollection +instanceKlass java/util/ArrayList$Itr +instanceKlass java/util/ImmutableCollections$ListItr +instanceKlass java/util/ListIterator +instanceKlass java/lang/ModuleLayer +instanceKlass jdk/internal/module/ModuleLoaderMap$Mapper +instanceKlass java/util/function/Function +instanceKlass jdk/internal/module/ModuleLoaderMap +instanceKlass java/util/ImmutableCollections$Set12$1 +instanceKlass java/util/ImmutableCollections$MapN$MapNIterator +instanceKlass java/util/AbstractMap$1$1 +instanceKlass java/lang/module/ResolvedModule +instanceKlass java/lang/module/Configuration +instanceKlass java/util/ImmutableCollections$SetN$SetNIterator +instanceKlass jdk/internal/loader/BuiltinClassLoader$LoadedModule +instanceKlass jdk/internal/util/Preconditions +instanceKlass java/util/Deque +instanceKlass java/util/Queue +instanceKlass sun/net/util/IPAddressUtil +instanceKlass java/net/URLStreamHandler +instanceKlass sun/net/www/ParseUtil +instanceKlass java/io/ExpiringCache$Entry +instanceKlass java/net/URL$3 +instanceKlass jdk/internal/misc/JavaNetURLAccess +instanceKlass java/net/URL$DefaultFactory +instanceKlass java/net/URLStreamHandlerFactory +instanceKlass jdk/internal/loader/URLClassPath +instanceKlass java/security/Principal +instanceKlass java/security/ProtectionDomain$Key +instanceKlass java/security/ProtectionDomain$JavaSecurityAccessImpl +instanceKlass jdk/internal/misc/JavaSecurityAccess +instanceKlass java/lang/ClassLoader$ParallelLoaders +instanceKlass jdk/internal/loader/AbstractClassLoaderValue +instanceKlass jdk/internal/module/ServicesCatalog +instanceKlass jdk/internal/loader/BootLoader +instanceKlass java/util/Optional +instanceKlass jdk/internal/module/ModuleBootstrap$Counters +instanceKlass jdk/internal/module/SystemModuleFinders$SystemModuleFinder +instanceKlass java/lang/module/ModuleFinder +instanceKlass jdk/internal/module/SystemModuleFinders$3 +instanceKlass jdk/internal/module/ModuleHashes$HashSupplier +instanceKlass java/util/KeyValueHolder +instanceKlass jdk/internal/module/SystemModuleFinders$2 +instanceKlass java/util/function/Supplier +instanceKlass java/lang/module/ModuleReference +instanceKlass jdk/internal/module/ModuleResolution +instanceKlass java/util/Collections$UnmodifiableMap +instanceKlass jdk/internal/module/ModuleHashes$Builder +instanceKlass jdk/internal/module/ModuleHashes +instanceKlass jdk/internal/module/ModuleTarget +instanceKlass java/lang/Enum +instanceKlass java/lang/module/ModuleDescriptor$Version +instanceKlass java/lang/module/ModuleDescriptor$Provides +instanceKlass java/lang/module/ModuleDescriptor$Opens +instanceKlass java/lang/module/ModuleDescriptor$Exports +instanceKlass java/lang/module/ModuleDescriptor$Requires +instanceKlass jdk/internal/module/Builder +instanceKlass jdk/internal/module/SystemModules$default +instanceKlass jdk/internal/module/SystemModules +instanceKlass jdk/internal/module/SystemModulesMap +instanceKlass java/net/URI$1 +instanceKlass jdk/internal/misc/JavaNetUriAccess +instanceKlass java/net/URI +instanceKlass jdk/internal/module/SystemModuleFinders +instanceKlass jdk/internal/module/ArchivedModuleGraph +instanceKlass jdk/internal/module/ModulePatcher +instanceKlass java/util/ImmutableCollections +instanceKlass java/lang/module/ModuleDescriptor$1 +instanceKlass jdk/internal/misc/JavaLangModuleAccess +instanceKlass java/lang/module/ModuleDescriptor +instanceKlass jdk/internal/module/ModuleBootstrap +instanceKlass java/lang/CharacterData +instanceKlass java/lang/invoke/MethodHandleStatics +instanceKlass java/io/ExpiringCache +instanceKlass java/io/FileSystem +instanceKlass java/io/DefaultFileSystem +instanceKlass java/io/File +instanceKlass java/lang/System$2 +instanceKlass jdk/internal/misc/JavaLangAccess +instanceKlass sun/io/Win32ErrorMode +instanceKlass jdk/internal/misc/OSEnvironment +instanceKlass java/lang/Integer$IntegerCache +instanceKlass jdk/internal/misc/Signal$NativeHandler +instanceKlass java/util/Hashtable$Entry +instanceKlass jdk/internal/misc/Signal +instanceKlass java/lang/Terminator$1 +instanceKlass jdk/internal/misc/Signal$Handler +instanceKlass java/lang/Terminator +instanceKlass java/nio/ByteOrder +instanceKlass java/nio/Buffer$1 +instanceKlass jdk/internal/misc/JavaNioAccess +instanceKlass java/nio/charset/CodingErrorAction +instanceKlass java/nio/charset/CharsetEncoder +instanceKlass sun/nio/cs/ArrayEncoder +instanceKlass java/util/HashMap$Node +instanceKlass jdk/internal/reflect/Reflection +instanceKlass java/lang/Class$1 +instanceKlass java/lang/reflect/ReflectAccess +instanceKlass jdk/internal/reflect/LangReflectAccess +instanceKlass java/lang/reflect/Modifier +instanceKlass java/lang/Class$Atomic +instanceKlass java/lang/Class$ReflectionData +instanceKlass sun/nio/cs/SingleByte +instanceKlass java/lang/StringUTF16 +instanceKlass java/nio/charset/StandardCharsets +instanceKlass sun/nio/cs/HistoricallyNamedCharset +instanceKlass java/util/Arrays +instanceKlass sun/security/action/GetPropertyAction +instanceKlass java/lang/ThreadLocal +instanceKlass java/nio/charset/spi/CharsetProvider +instanceKlass java/nio/charset/Charset +instanceKlass java/io/Writer +instanceKlass java/io/OutputStream +instanceKlass java/io/Flushable +instanceKlass java/io/FileDescriptor$1 +instanceKlass jdk/internal/misc/JavaIOFileDescriptorAccess +instanceKlass java/io/FileDescriptor +instanceKlass java/lang/VersionProps +instanceKlass jdk/internal/util/StaticProperty +instanceKlass java/lang/Math +instanceKlass java/util/concurrent/ConcurrentHashMap$MapEntry +instanceKlass java/util/concurrent/ConcurrentHashMap$Traverser +instanceKlass java/util/Iterator +instanceKlass java/lang/reflect/Array +instanceKlass java/util/Collections$SynchronizedCollection +instanceKlass java/util/List +instanceKlass java/util/RandomAccess +instanceKlass java/util/Collections +instanceKlass java/util/concurrent/ConcurrentHashMap$CollectionView +instanceKlass java/util/Properties$EntrySet +instanceKlass java/lang/StringLatin1 +instanceKlass jdk/internal/misc/VM +instanceKlass jdk/internal/misc/SharedSecrets +instanceKlass java/lang/ref/Reference$1 +instanceKlass jdk/internal/misc/JavaLangRefAccess +instanceKlass java/lang/ref/ReferenceQueue$Lock +instanceKlass java/lang/ref/ReferenceQueue +instanceKlass jdk/internal/reflect/ReflectionFactory +instanceKlass java/util/concurrent/locks/LockSupport +instanceKlass java/util/concurrent/ConcurrentHashMap$Node +instanceKlass java/util/Map$Entry +instanceKlass java/util/concurrent/ConcurrentHashMap$CounterCell +instanceKlass java/util/concurrent/locks/ReentrantLock +instanceKlass java/util/concurrent/locks/Lock +instanceKlass java/lang/Runtime +instanceKlass java/util/concurrent/ConcurrentMap +instanceKlass java/util/AbstractMap +instanceKlass java/security/cert/Certificate +instanceKlass jdk/internal/reflect/ReflectionFactory$GetReflectionFactoryAction +instanceKlass java/security/PrivilegedAction +instanceKlass java/util/Objects +instanceKlass java/util/AbstractCollection +instanceKlass java/util/Set +instanceKlass java/util/Collection +instanceKlass java/lang/Iterable +instanceKlass java/security/AccessController +instanceKlass java/lang/String$CaseInsensitiveComparator +instanceKlass java/util/Comparator +instanceKlass java/io/ObjectStreamField +instanceKlass java/lang/Number +instanceKlass java/lang/Character +instanceKlass java/lang/Boolean +instanceKlass java/util/concurrent/locks/AbstractOwnableSynchronizer +instanceKlass java/lang/LiveStackFrame +instanceKlass java/lang/StackFrameInfo +instanceKlass java/lang/StackWalker$StackFrame +instanceKlass java/lang/StackStreamFactory$AbstractStackWalker +instanceKlass java/lang/StackWalker +instanceKlass java/nio/Buffer +instanceKlass java/lang/StackTraceElement +instanceKlass java/security/CodeSource +instanceKlass jdk/internal/loader/ClassLoaders +instanceKlass java/util/jar/Manifest +instanceKlass java/net/URL +instanceKlass java/io/InputStream +instanceKlass java/io/Closeable +instanceKlass java/lang/AutoCloseable +instanceKlass jdk/internal/module/Modules +instanceKlass jdk/internal/misc/Unsafe +instanceKlass java/lang/AbstractStringBuilder +instanceKlass java/lang/Appendable +instanceKlass java/lang/AssertionStatusDirectives +instanceKlass java/lang/invoke/MethodHandleNatives$CallSiteContext +instanceKlass java/lang/invoke/CallSite +instanceKlass java/lang/invoke/MethodType +instanceKlass java/lang/invoke/LambdaForm +instanceKlass java/lang/invoke/MethodHandleNatives +instanceKlass java/lang/invoke/ResolvedMethodName +instanceKlass java/lang/invoke/MemberName +instanceKlass java/lang/invoke/VarHandle +instanceKlass java/lang/invoke/MethodHandle +instanceKlass jdk/internal/reflect/CallerSensitive +instanceKlass java/lang/annotation/Annotation +instanceKlass jdk/internal/reflect/FieldAccessor +instanceKlass jdk/internal/reflect/ConstantPool +instanceKlass jdk/internal/reflect/ConstructorAccessor +instanceKlass jdk/internal/reflect/MethodAccessor +instanceKlass jdk/internal/reflect/MagicAccessorImpl +instanceKlass java/lang/reflect/Parameter +instanceKlass java/lang/reflect/Member +instanceKlass java/lang/reflect/AccessibleObject +instanceKlass java/lang/Module +instanceKlass java/util/Dictionary +instanceKlass java/util/Map +instanceKlass java/lang/ThreadGroup +instanceKlass java/lang/Thread$UncaughtExceptionHandler +instanceKlass java/lang/Thread +instanceKlass java/lang/Runnable +instanceKlass java/lang/ref/Reference +instanceKlass java/security/AccessControlContext +instanceKlass java/security/ProtectionDomain +instanceKlass java/lang/SecurityManager +instanceKlass java/lang/Throwable +instanceKlass java/lang/System +instanceKlass java/lang/ClassLoader +instanceKlass java/lang/Cloneable +instanceKlass java/lang/Class +instanceKlass java/lang/reflect/Type +instanceKlass java/lang/reflect/GenericDeclaration +instanceKlass java/lang/reflect/AnnotatedElement +instanceKlass java/lang/String +instanceKlass java/lang/CharSequence +instanceKlass java/lang/Comparable +instanceKlass java/io/Serializable +ciInstanceKlass java/lang/Object 1 1 92 7 10 10 10 10 8 10 10 10 10 100 8 10 3 8 10 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 7 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 12 12 7 12 12 1 12 7 12 12 12 1 1 12 1 12 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/io/Serializable 1 0 7 100 100 1 1 1 1 +ciInstanceKlass java/lang/CharSequence 1 1 128 18 100 10 18 10 10 100 11 11 10 11 100 10 10 100 10 10 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 15 16 15 16 12 1 100 12 15 100 12 12 1 12 12 100 12 12 1 12 100 12 1 12 1 1 1 10 1 11 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 12 12 12 100 1 1 1 100 1 1 1 100 1 1 +ciInstanceKlass java/lang/String 1 1 878 10 8 9 9 9 10 10 10 9 10 7 10 10 10 10 10 100 8 10 10 9 9 8 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 10 10 100 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 100 10 10 11 11 10 10 10 10 10 10 9 11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 10 10 10 10 10 10 100 10 7 10 10 10 10 10 8 10 10 100 3 3 7 10 10 10 10 10 11 7 10 10 100 10 10 10 11 11 11 7 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 100 10 100 10 10 100 10 10 10 100 10 10 10 10 8 10 10 10 8 8 10 10 10 10 10 10 10 100 10 8 10 10 10 7 3 8 8 8 10 10 10 10 10 10 8 8 10 8 8 8 8 8 10 10 10 8 7 10 10 10 7 9 7 10 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 7 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 12 12 12 12 12 12 12 7 12 1 7 7 12 12 12 12 1 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 1 12 12 12 12 100 12 12 12 12 12 12 12 12 12 12 1 1 12 12 12 12 12 12 12 12 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 7 12 12 12 12 7 12 12 12 12 100 12 12 7 12 1 1 12 12 12 1 12 1 1 12 12 12 12 7 12 12 12 1 12 12 100 12 12 12 1 12 7 12 12 12 12 12 12 12 12 12 12 12 1 1 1 12 1 100 12 1 1 12 1 12 12 1 12 12 1 1 12 12 12 100 12 100 12 100 12 1 1 12 12 1 1 1 1 12 12 12 12 1 1 1 1 1 1 1 12 12 12 1 1 12 12 12 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/String COMPACT_STRINGS Z 1 +staticfield java/lang/String serialPersistentFields [Ljava/io/ObjectStreamField; 0 [Ljava/io/ObjectStreamField; +staticfield java/lang/String CASE_INSENSITIVE_ORDER Ljava/util/Comparator; java/lang/String$CaseInsensitiveComparator +ciInstanceKlass java/lang/Class 1 1 1435 10 9 9 7 10 10 8 10 8 8 10 10 10 10 10 10 10 10 10 10 10 8 10 8 8 10 7 8 8 8 10 11 10 10 8 10 10 10 10 9 10 10 10 18 10 7 10 10 10 100 10 9 7 7 8 10 10 10 10 7 10 7 7 10 10 9 10 10 7 10 100 10 10 10 9 10 10 10 9 10 10 7 10 10 10 10 9 8 10 10 10 10 10 10 9 10 7 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 8 10 10 100 10 100 11 10 10 10 10 10 10 8 10 10 8 9 10 10 10 10 100 9 10 9 10 10 10 8 10 10 10 10 100 10 10 10 10 10 10 10 7 10 10 10 10 10 10 10 10 10 7 10 10 11 10 10 10 10 10 10 100 10 10 10 100 7 10 10 10 10 10 10 10 10 11 10 10 9 10 9 7 10 9 10 7 10 9 10 10 10 10 10 10 10 8 10 10 9 9 10 7 9 10 10 7 10 10 10 10 9 10 9 10 10 9 9 10 10 9 7 10 10 7 10 7 11 9 9 7 10 9 9 10 10 9 7 10 10 10 10 10 10 10 9 10 10 10 10 8 7 10 7 8 8 8 8 10 9 9 10 7 9 7 10 7 10 10 9 8 10 7 10 7 10 9 100 8 10 7 4 10 10 11 10 100 10 10 8 8 10 9 11 7 11 9 10 10 10 9 9 10 10 10 10 10 11 11 11 11 7 11 10 10 100 11 10 10 10 11 11 7 10 10 9 9 10 10 10 10 100 10 10 7 9 100 7 100 100 1 1 1 7 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 1 12 1 12 1 1 12 12 12 12 12 12 7 12 12 12 12 1 12 1 1 12 1 1 1 1 12 12 12 1 7 12 12 12 7 12 7 12 12 7 12 12 1 15 16 15 16 12 7 12 1 12 12 7 1 12 12 1 1 1 12 12 12 12 1 12 1 1 12 12 12 12 1 100 12 12 12 12 12 12 12 12 12 1 12 12 12 12 1 12 12 12 12 12 12 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 1 12 1 12 1 12 100 12 12 12 12 12 1 12 12 1 12 12 12 12 12 1 12 12 12 12 12 1 12 12 12 12 1 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 1 7 12 12 12 12 100 12 12 12 1 12 12 1 1 12 12 12 12 12 12 100 12 7 12 12 12 12 12 12 1 12 12 1 12 12 100 12 12 12 100 12 12 12 12 1 12 12 12 12 12 1 12 12 12 1 12 12 7 12 7 12 12 12 12 12 12 12 12 12 12 12 1 12 1 12 7 12 12 1 12 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 1 7 1 1 1 1 12 12 12 12 1 12 1 1 1 12 100 12 12 1 12 1 12 12 1 1 1 12 12 12 1 12 1 1 12 12 12 1 12 12 100 12 7 12 12 12 12 12 12 12 12 12 12 12 12 1 12 7 12 12 1 12 100 12 12 12 12 1 12 12 12 100 12 12 100 12 12 12 1 12 12 1 12 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 1 1 100 1 1 100 1 1 +staticfield java/lang/Class EMPTY_CLASS_ARRAY [Ljava/lang/Class; 0 [Ljava/lang/Class; +staticfield java/lang/Class serialPersistentFields [Ljava/io/ObjectStreamField; 0 [Ljava/io/ObjectStreamField; +ciInstanceKlass java/lang/Cloneable 1 0 7 100 100 1 1 1 1 +instanceKlass jdk/internal/reflect/DelegatingClassLoader +instanceKlass java/security/SecureClassLoader +ciInstanceKlass java/lang/ClassLoader 1 1 1194 9 10 9 10 7 10 10 9 10 100 10 10 10 100 8 10 10 10 10 7 10 7 7 7 10 10 9 7 10 9 9 9 9 9 7 10 9 10 10 9 9 7 9 7 10 10 9 10 7 10 8 10 10 10 7 10 10 8 10 10 10 10 10 10 10 10 7 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 10 100 10 10 10 10 10 100 8 10 8 10 10 100 8 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 8 11 9 11 10 8 8 10 100 10 10 10 10 10 10 10 10 10 7 10 10 10 7 10 100 18 10 10 10 7 10 10 10 100 10 10 10 10 8 100 10 10 9 10 10 100 8 10 10 8 8 10 10 7 10 10 100 100 10 100 100 10 10 8 10 9 8 9 10 10 10 10 9 10 10 10 10 10 8 10 7 18 10 10 10 10 8 10 10 18 11 100 10 10 10 11 10 18 10 11 18 11 10 10 9 7 10 10 8 10 8 10 7 10 10 100 8 10 10 10 8 8 10 10 10 8 8 10 10 10 7 10 10 10 10 10 11 11 11 11 11 7 10 9 9 9 10 10 100 10 100 10 10 10 9 9 9 9 9 9 8 10 10 10 10 10 11 10 100 10 10 10 7 7 10 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 12 12 12 1 12 12 12 12 1 12 12 12 1 1 12 7 12 12 1 1 1 12 12 12 1 12 12 12 12 12 1 12 12 12 12 12 12 1 12 1 12 12 12 1 1 12 12 1 12 7 12 1 12 12 12 12 12 12 12 12 1 12 7 12 12 12 12 12 12 12 12 12 100 12 12 12 12 1 12 1 12 7 12 12 12 1 1 1 12 12 1 1 12 12 12 12 12 12 12 12 12 12 12 12 7 12 12 12 12 12 12 12 12 12 12 1 12 12 12 1 1 12 1 12 12 12 12 12 7 12 12 7 1 12 12 1 12 1 1 15 16 15 16 12 100 12 100 12 7 12 1 12 12 12 1 12 12 7 12 12 1 1 12 12 7 12 12 1 1 12 1 1 12 12 1 12 100 12 1 1 12 1 1 12 12 1 12 12 1 12 12 12 12 12 100 12 12 12 12 12 12 1 12 1 16 15 16 12 12 12 12 12 1 12 12 16 15 16 12 12 1 12 12 12 15 12 7 12 16 15 16 12 12 12 12 12 1 12 12 1 12 1 12 1 12 1 1 12 12 1 1 12 12 100 12 1 1 100 12 12 1 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 1 1 12 12 12 12 12 12 12 12 12 12 7 12 12 12 12 12 100 12 1 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 1 1 1 1 1 1 1 10 1 1 1 1 1 10 1 1 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 12 12 12 12 12 1 1 100 1 1 100 1 1 +staticfield java/lang/ClassLoader nocerts [Ljava/security/cert/Certificate; 0 [Ljava/security/cert/Certificate; +staticfield java/lang/ClassLoader loadedLibraryNames Ljava/util/Set; java/util/HashSet +staticfield java/lang/ClassLoader $assertionsDisabled Z 1 +ciInstanceKlass java/lang/System 1 1 631 10 10 10 10 10 9 7 10 11 10 10 10 100 8 10 10 9 100 8 10 10 8 10 100 10 8 10 10 100 10 10 10 9 9 7 10 10 10 10 10 10 10 100 100 8 10 10 7 10 100 8 10 8 10 100 8 10 100 10 8 10 10 10 8 10 10 10 100 8 10 10 10 100 18 100 9 10 100 10 10 10 10 10 10 10 10 7 7 10 10 100 10 10 100 8 10 9 9 10 10 10 10 8 10 10 8 10 10 8 10 7 9 10 7 9 10 9 7 10 8 10 8 10 10 10 10 10 10 10 10 10 9 100 8 10 8 10 10 8 100 10 10 10 10 100 10 10 10 10 10 8 10 10 10 10 8 10 10 10 7 10 10 10 9 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 100 12 12 12 12 12 12 1 7 12 100 12 100 12 12 12 1 1 12 12 12 1 1 12 100 12 1 12 1 12 12 12 1 12 100 12 12 12 12 1 12 7 12 12 12 12 12 1 1 1 12 12 1 12 1 1 1 12 1 1 1 1 12 12 7 12 1 12 100 12 7 12 1 1 12 100 12 1 1 15 16 15 16 12 1 12 12 1 12 12 7 12 12 12 12 12 12 1 1 12 12 1 12 7 12 1 1 12 12 12 12 12 12 1 12 12 1 12 12 1 7 12 1 7 12 12 1 12 12 1 12 1 12 1 7 12 12 7 12 12 7 12 12 7 12 12 7 12 12 1 1 12 1 12 1 1 12 12 12 1 12 12 12 100 12 1 12 12 1 12 12 12 1 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 12 1 1 100 1 1 100 1 1 +staticfield java/lang/System in Ljava/io/InputStream; java/io/BufferedInputStream +staticfield java/lang/System out Ljava/io/PrintStream; java/io/PrintStream +staticfield java/lang/System err Ljava/io/PrintStream; java/io/PrintStream +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryClassSignatureParser$ClsFormatException +instanceKlass java/lang/Exception +instanceKlass java/lang/Error +ciInstanceKlass java/lang/Throwable 1 1 395 10 9 9 9 9 9 10 9 10 10 100 100 10 8 10 8 10 10 10 100 8 10 10 10 10 8 9 10 100 10 10 100 10 10 11 10 10 10 8 10 10 7 8 8 10 10 8 8 9 10 100 10 11 8 8 10 8 10 8 100 10 9 10 10 100 9 10 10 100 8 10 10 10 10 100 10 10 11 11 11 8 8 10 10 10 9 8 7 10 10 100 8 10 11 8 9 10 11 9 11 100 10 7 10 100 1 1 1 100 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 1 1 1 12 1 100 12 12 1 1 12 7 12 12 1 100 12 12 1 12 12 1 7 12 12 12 12 12 1 12 12 1 1 1 12 12 1 1 12 100 12 1 12 1 1 12 1 12 1 1 12 12 12 100 12 12 12 100 1 1 12 12 100 12 1 100 12 12 12 12 12 1 1 100 12 1 1 12 1 1 12 1 12 100 12 12 12 12 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/Throwable UNASSIGNED_STACK [Ljava/lang/StackTraceElement; 0 [Ljava/lang/StackTraceElement; +staticfield java/lang/Throwable SUPPRESSED_SENTINEL Ljava/util/List; java/util/Collections$EmptyList +staticfield java/lang/Throwable EMPTY_THROWABLE_ARRAY [Ljava/lang/Throwable; 0 [Ljava/lang/Throwable; +staticfield java/lang/Throwable $assertionsDisabled Z 1 +instanceKlass java/io/IOError +instanceKlass kotlin/jvm/KotlinReflectionNotSupportedError +instanceKlass java/lang/AssertionError +instanceKlass java/lang/VirtualMachineError +instanceKlass java/lang/LinkageError +instanceKlass java/lang/ThreadDeath +ciInstanceKlass java/lang/Error 1 1 40 10 10 10 10 10 100 7 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 1 1 +ciInstanceKlass java/lang/ThreadDeath 0 0 21 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 12 1 1 +instanceKlass org/jetbrains/kotlin/types/TypeSubstitutor$SubstitutionException +instanceKlass org/jetbrains/kotlin/com/intellij/util/AstLoadingException +instanceKlass org/jetbrains/kotlin/container/UnresolvedDependenciesException +instanceKlass org/jetbrains/kotlin/container/InvalidCardinalityException +instanceKlass org/jetbrains/kotlin/container/ContainerConsistencyException +instanceKlass org/jetbrains/kotlin/com/intellij/psi/scope/MethodProcessorSetupFailedException +instanceKlass java/text/ParseException +instanceKlass javax/xml/stream/XMLStreamException +instanceKlass java/security/PrivilegedActionException +instanceKlass org/jetbrains/kotlin/org/jdom/JDOMException +instanceKlass org/jetbrains/kotlin/com/intellij/util/cls/ClsFormatException +instanceKlass java/lang/CloneNotSupportedException +instanceKlass java/net/URISyntaxException +instanceKlass kotlin/reflect/jvm/internal/impl/types/TypeSubstitutor$SubstitutionException +instanceKlass java/lang/InterruptedException +instanceKlass java/io/IOException +instanceKlass java/lang/ReflectiveOperationException +instanceKlass java/lang/RuntimeException +ciInstanceKlass java/lang/Exception 1 1 40 10 10 10 10 10 100 7 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 1 1 +instanceKlass org/jetbrains/kotlin/com/intellij/util/indexing/FileContentImpl$IllegalDataException +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/ClsElementImpl$InvalidMirrorException +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/compiled/OutOfOrderInnerClassException +instanceKlass java/util/EmptyStackException +instanceKlass org/jetbrains/kotlin/lexer/KotlinLexerException +instanceKlass org/jetbrains/kotlin/com/intellij/psi/text/BlockSupport$ReparsedSuccessfullyException +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/DebugUtil$IncorrectTreeStructureException +instanceKlass org/jetbrains/kotlin/util/ReenteringLazyValueComputationException +instanceKlass java/lang/TypeNotPresentException +instanceKlass org/jetbrains/kotlin/protobuf/UninitializedMessageException +instanceKlass org/jetbrains/kotlin/utils/WrappedValues$WrappedProcessCanceledException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/ReadOnlyFragmentModificationException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/editor/ReadOnlyModificationException +instanceKlass org/jetbrains/kotlin/kapt3/diagnostic/KaptError +instanceKlass org/jetbrains/kotlin/kapt3/base/util/KaptBaseError +instanceKlass org/jetbrains/kotlin/com/intellij/core/CoreJavaCodeStyleManager$1CancelException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/RecursionManager$CachingPreventedException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/StackOverflowPreventedException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/InvalidVirtualFileAccessException +instanceKlass org/jetbrains/kotlin/com/intellij/psi/PsiInvalidElementAccessException +instanceKlass java/util/ConcurrentModificationException +instanceKlass java/time/DateTimeException +instanceKlass java/nio/file/FileSystemAlreadyExistsException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/InvalidDataException +instanceKlass org/jetbrains/kotlin/com/intellij/serialization/SerializationException +instanceKlass org/jetbrains/kotlin/com/intellij/diagnostic/PluginException +instanceKlass java/util/MissingResourceException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/SortingException +instanceKlass org/jetbrains/kotlin/com/intellij/diagnostic/ImplementationConflictException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/diagnostic/RuntimeExceptionWithAttachments +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/ExtensionInstantiationException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/project/IndexNotReadyException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/ExtensionException +instanceKlass org/jetbrains/kotlin/com/intellij/util/lang/CompoundRuntimeException +instanceKlass org/jetbrains/kotlin/org/picocontainer/PicoException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/ExtensionNotApplicableException +instanceKlass java/nio/file/FileSystemNotFoundException +instanceKlass org/jetbrains/kotlin/cli/jvm/plugins/ServiceLoaderLite$ServiceLoadingException +instanceKlass org/jetbrains/kotlin/compiler/plugin/CliOptionProcessingException +instanceKlass org/jetbrains/kotlin/com/intellij/util/IncorrectOperationException +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/UninitializedMessageException +instanceKlass java/lang/SecurityException +instanceKlass java/lang/reflect/UndeclaredThrowableException +instanceKlass kotlin/reflect/jvm/internal/impl/utils/WrappedValues$WrappedProcessCanceledException +instanceKlass java/lang/IndexOutOfBoundsException +instanceKlass java/util/NoSuchElementException +instanceKlass kotlin/NoWhenBranchMatchedException +instanceKlass java/lang/UnsupportedOperationException +instanceKlass kotlin/UninitializedPropertyAccessException +instanceKlass java/lang/IllegalStateException +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/CompileEnvironmentException +instanceKlass org/jetbrains/kotlin/utils/KotlinExceptionWithAttachments +instanceKlass org/jetbrains/kotlin/analyzer/AnalysisResult$CompilationErrorException +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/ProcessCanceledException +instanceKlass java/lang/IllegalArgumentException +instanceKlass java/lang/ArithmeticException +instanceKlass java/lang/NullPointerException +instanceKlass java/lang/IllegalMonitorStateException +instanceKlass java/lang/ArrayStoreException +instanceKlass java/lang/ClassCastException +ciInstanceKlass java/lang/RuntimeException 1 1 40 10 10 10 10 10 100 7 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 1 1 +ciInstanceKlass java/lang/SecurityManager 0 0 572 10 9 100 10 100 8 10 10 10 10 100 10 100 10 9 10 10 10 100 8 10 9 9 8 9 100 10 8 10 10 10 100 10 10 100 100 8 10 8 8 8 8 8 8 10 8 8 8 8 8 10 10 8 100 8 10 8 8 8 8 8 10 8 100 8 8 10 8 8 10 100 8 10 10 100 10 10 10 10 10 10 11 18 11 18 11 18 18 11 18 11 9 9 9 9 100 10 10 10 18 18 10 18 10 18 18 8 10 9 11 8 100 10 10 10 9 10 10 8 100 10 9 8 8 100 10 10 10 9 11 10 11 10 100 100 10 10 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 12 12 1 100 12 1 1 12 12 100 12 1 1 12 100 12 12 12 1 1 12 12 1 12 1 1 12 12 12 1 12 1 1 1 12 1 1 1 1 1 1 12 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 100 12 1 1 1 1 1 1 12 1 1 12 1 12 12 12 100 12 12 100 12 100 12 1 15 16 15 16 12 100 12 16 15 16 12 12 15 16 15 16 12 16 15 16 12 12 12 12 12 12 1 100 12 12 12 15 16 12 15 16 100 12 15 12 12 15 16 15 16 1 12 12 100 12 1 1 12 12 12 12 12 12 1 1 12 1 1 1 12 100 12 12 12 12 12 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 10 1 1 1 1 1 1 10 1 1 1 1 1 10 11 1 1 1 10 1 1 1 1 1 1 10 1 10 1 1 1 11 1 1 10 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 100 12 12 12 100 12 12 12 12 12 1 1 100 1 1 1 1 1 1 1 1 100 1 1 +ciInstanceKlass java/security/ProtectionDomain 1 1 331 10 9 7 10 9 9 9 10 7 9 9 7 9 9 10 100 10 10 10 10 9 9 10 7 10 100 10 9 8 100 8 10 10 10 10 8 11 8 10 8 8 10 10 10 10 8 10 8 8 10 9 10 9 10 100 100 10 10 7 10 100 10 10 11 11 100 11 10 10 11 11 10 10 10 11 10 8 8 10 7 10 10 7 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 7 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 100 1 1 1 1 1 100 12 12 1 12 12 12 12 12 1 12 12 1 12 12 100 12 100 12 12 12 12 100 12 12 1 1 12 100 12 1 1 1 12 12 12 1 1 12 1 1 12 12 12 12 1 12 1 1 100 12 12 12 12 12 1 1 100 12 1 1 12 12 12 12 1 12 12 12 12 12 12 100 12 12 12 1 1 7 12 1 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/security/ProtectionDomain filePermCompatInPD Z 0 +ciInstanceKlass java/security/AccessControlContext 1 1 367 9 9 10 8 10 10 9 9 9 10 7 100 10 11 11 11 11 7 11 10 10 9 10 11 10 7 100 8 10 10 7 10 9 9 9 9 9 9 9 10 9 10 10 8 10 10 10 100 10 10 10 10 8 10 8 10 8 8 10 8 10 8 10 10 10 8 8 100 10 10 100 10 8 10 10 10 8 10 10 10 7 10 10 10 10 10 10 10 10 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 100 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 100 12 1 100 12 12 12 12 12 7 12 1 12 12 12 12 12 1 12 12 100 12 100 12 12 12 1 1 1 12 12 1 7 12 12 12 12 12 12 12 12 7 12 12 12 12 1 12 12 100 12 1 12 100 12 1 12 1 100 12 1 1 12 1 12 1 12 12 12 1 1 1 12 12 1 12 1 12 12 1 12 12 12 1 12 12 12 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass java/net/URLClassLoader +instanceKlass jdk/internal/loader/BuiltinClassLoader +ciInstanceKlass java/security/SecureClassLoader 1 1 127 10 7 10 9 10 10 9 10 10 10 10 10 10 7 10 7 10 7 10 11 7 100 8 10 10 7 7 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 12 12 7 12 12 12 12 12 12 12 12 12 1 1 12 1 12 7 12 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass java/lang/reflect/InvocationTargetException +instanceKlass java/lang/NoSuchMethodException +instanceKlass java/lang/IllegalAccessException +instanceKlass java/lang/InstantiationException +instanceKlass java/lang/NoSuchFieldException +instanceKlass java/lang/ClassNotFoundException +ciInstanceKlass java/lang/ReflectiveOperationException 1 1 34 10 10 10 10 100 7 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 1 1 +ciInstanceKlass java/lang/ClassNotFoundException 1 1 37 100 10 10 9 100 7 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 1 1 1 +instanceKlass java/lang/IncompatibleClassChangeError +instanceKlass java/lang/UnsatisfiedLinkError +instanceKlass java/lang/BootstrapMethodError +instanceKlass java/lang/NoClassDefFoundError +ciInstanceKlass java/lang/LinkageError 1 1 31 10 10 10 100 7 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 1 1 +ciInstanceKlass java/lang/NoClassDefFoundError 0 0 26 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 +instanceKlass kotlin/TypeCastException +ciInstanceKlass java/lang/ClassCastException 1 1 26 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 +ciInstanceKlass java/lang/ArrayStoreException 1 1 26 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 +instanceKlass java/lang/InternalError +instanceKlass java/lang/StackOverflowError +instanceKlass java/lang/OutOfMemoryError +ciInstanceKlass java/lang/VirtualMachineError 1 1 34 10 10 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 1 1 +ciInstanceKlass java/lang/OutOfMemoryError 1 1 26 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 +ciInstanceKlass java/lang/StackOverflowError 1 1 26 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 +ciInstanceKlass java/lang/IllegalMonitorStateException 1 1 26 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 +instanceKlass java/lang/ref/PhantomReference +instanceKlass java/lang/ref/FinalReference +instanceKlass java/lang/ref/WeakReference +instanceKlass java/lang/ref/SoftReference +ciInstanceKlass java/lang/ref/Reference 1 1 159 10 9 10 9 9 7 10 10 9 9 10 10 10 9 9 100 10 10 10 7 10 10 10 7 8 10 7 10 10 10 7 10 10 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 7 1 1 1 1 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 1 12 12 1 12 12 12 1 1 12 1 12 12 12 1 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/ref/Reference processPendingLock Ljava/lang/Object; java/lang/Object +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentSoftKeySoftValueHashMap$SoftKey +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentWeakKeySoftValueHashMap$SoftValue +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentSoftValueHashMap$MySoftReference +instanceKlass java/util/ResourceBundle$BundleReference +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/SoftKeySoftValueHashMap$ValueReference +instanceKlass sun/util/locale/provider/LocaleResources$ResourceReference +instanceKlass sun/util/resources/Bundles$BundleReference +instanceKlass org/jetbrains/kotlin/com/intellij/reference/SoftReference +instanceKlass java/lang/invoke/LambdaFormEditor$Transform +instanceKlass jdk/internal/ref/SoftCleanable +instanceKlass sun/util/locale/LocaleObjectCache$CacheEntry +ciInstanceKlass java/lang/ref/SoftReference 1 1 47 10 9 9 10 10 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 12 12 12 12 12 1 1 1 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentWeakKeyWeakValueHashMap$WeakValue +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentWeakKeySoftValueHashMap$WeakKey +instanceKlass java/lang/WeakPairMap$WeakRefPeer +instanceKlass org/jetbrains/kotlin/com/intellij/util/PatchedWeakReference +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentWeakValueHashMap$MyWeakReference +instanceKlass java/util/ResourceBundle$KeyElementReference +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentWeakHashMap$WeakKey +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/UnsafeWeakList$MyReference +instanceKlass jdk/internal/jimage/ImageBufferCache$BufferReference +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentIntKeyWeakValueHashMap$MyRef +instanceKlass java/lang/ClassValue$Entry +instanceKlass java/util/logging/LogManager$LoggerWeakRef +instanceKlass java/util/logging/Level$KnownLevel +instanceKlass java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry +instanceKlass jdk/internal/ref/WeakCleanable +instanceKlass java/lang/ThreadLocal$ThreadLocalMap$Entry +instanceKlass java/util/WeakHashMap$Entry +ciInstanceKlass java/lang/ref/WeakReference 1 1 31 10 10 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 +instanceKlass java/lang/ref/Finalizer +ciInstanceKlass java/lang/ref/FinalReference 1 1 36 10 100 8 10 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 1 12 1 1 1 +instanceKlass jdk/internal/ref/PhantomCleanable +instanceKlass jdk/internal/ref/Cleaner +ciInstanceKlass java/lang/ref/PhantomReference 1 1 30 10 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 1 +ciInstanceKlass java/lang/ref/Finalizer 1 1 139 9 10 9 9 9 9 7 10 10 7 11 100 10 100 10 10 10 100 10 10 7 10 7 10 10 10 10 7 10 7 10 10 10 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 12 12 12 12 12 12 1 12 12 1 7 12 1 12 1 12 100 12 100 12 1 12 12 1 1 12 12 12 1 12 1 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/ref/Finalizer lock Ljava/lang/Object; java/lang/Object +instanceKlass java/util/logging/LogManager$Cleaner +instanceKlass jdk/internal/misc/InnocuousThread +instanceKlass java/lang/ref/Finalizer$FinalizerThread +instanceKlass java/lang/ref/Reference$ReferenceHandler +ciInstanceKlass java/lang/Thread 1 1 592 9 9 10 9 9 100 8 10 3 8 3 10 10 9 9 9 9 7 100 8 10 9 10 10 10 10 10 10 9 10 10 9 10 10 9 10 9 10 9 9 10 10 9 10 9 100 10 100 10 8 10 10 10 10 10 10 9 100 10 10 10 10 100 11 9 10 10 10 9 10 9 10 100 10 10 10 11 10 10 10 7 10 10 10 10 10 10 10 10 10 10 100 8 10 10 10 8 10 8 10 8 8 10 10 100 8 10 9 9 10 10 10 9 10 100 10 11 9 9 10 100 10 11 100 10 10 11 10 100 10 10 10 8 9 10 11 10 11 10 7 7 1 1 100 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 7 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 1 1 12 1 12 12 12 12 12 12 1 1 1 12 7 12 12 12 12 12 100 12 12 12 12 12 12 12 12 12 7 12 12 12 12 100 12 12 12 12 1 1 1 12 12 12 12 12 12 12 1 12 12 12 1 12 100 12 12 12 12 12 12 12 1 12 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 1 1 12 12 1 12 1 1 1 100 12 100 12 1 12 12 12 12 12 12 1 12 12 12 12 12 1 12 100 12 1 12 12 12 12 1 12 12 100 12 12 12 12 100 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/Thread EMPTY_STACK_TRACE [Ljava/lang/StackTraceElement; 0 [Ljava/lang/StackTraceElement; +ciInstanceKlass java/lang/ThreadGroup 1 1 289 10 9 8 9 7 9 9 10 10 10 10 10 9 10 10 9 10 9 9 10 100 10 10 10 9 10 10 9 10 10 10 10 10 10 10 10 10 10 10 100 10 10 10 7 10 100 10 9 10 8 10 10 10 10 11 100 9 100 10 8 10 10 8 10 10 10 10 8 10 8 10 8 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 12 1 12 12 12 12 12 12 12 12 12 12 12 100 12 12 12 100 12 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 1 12 12 12 12 1 12 12 12 12 1 12 1 1 12 12 1 12 12 12 100 1 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/util/Map 1 1 258 11 11 10 11 11 11 11 7 11 11 100 100 10 11 11 11 11 10 11 11 10 100 10 7 7 10 7 10 100 11 100 11 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 7 12 12 100 12 12 12 1 12 12 1 1 12 12 12 12 12 12 12 7 12 7 12 1 1 12 1 1 1 12 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass java/util/Hashtable +ciInstanceKlass java/util/Dictionary 1 1 36 10 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 1 +instanceKlass java/util/Properties +ciInstanceKlass java/util/Hashtable 1 1 488 100 10 9 100 100 10 8 10 10 10 10 10 8 10 9 7 9 7 4 10 9 4 10 11 10 10 9 10 100 10 9 10 9 10 10 3 9 9 3 10 10 10 11 11 11 11 100 11 11 10 10 10 9 9 9 10 100 100 10 10 8 10 10 8 10 8 10 7 10 10 100 10 10 100 10 100 10 10 100 11 11 100 10 10 10 11 100 10 11 11 10 10 10 10 10 10 10 100 10 10 8 10 10 100 11 10 10 10 7 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 100 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 12 12 12 12 7 12 1 12 12 1 12 1 7 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 100 12 12 12 1 12 12 12 12 12 12 12 12 1 1 12 1 12 1 1 100 12 1 12 12 1 12 12 1 1 12 1 12 12 1 100 12 12 1 12 12 12 12 12 12 12 12 100 12 1 12 1 12 100 12 1 100 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/util/Properties 1 1 639 10 100 10 7 10 9 9 9 10 10 8 10 7 10 10 8 10 7 10 10 9 10 7 10 10 10 100 8 10 10 10 10 100 3 10 10 10 8 10 10 10 10 10 100 100 10 10 100 8 10 10 10 100 10 10 10 11 11 11 7 11 11 10 8 10 10 100 10 10 10 8 10 10 10 100 100 100 10 8 8 10 10 10 7 10 10 10 100 10 10 11 10 8 10 11 8 10 11 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 7 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 7 10 100 10 11 4 11 10 10 11 10 10 10 100 8 10 10 10 100 6 0 10 11 10 10 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 100 7 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 100 1 1 1 1 1 12 1 12 1 12 12 12 12 7 12 12 1 7 12 1 12 12 1 12 1 12 12 12 12 1 12 12 12 1 1 12 12 12 12 1 12 12 1 12 12 12 12 12 1 1 12 12 1 1 12 12 12 1 12 7 12 12 12 1 12 12 12 1 12 12 1 12 100 12 1 12 100 12 12 1 1 1 1 1 12 12 12 1 12 12 1 12 12 7 12 1 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 1 12 12 12 12 12 100 12 12 1 1 12 100 12 1 12 100 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/util/Properties UNSAFE Ljdk/internal/misc/Unsafe; jdk/internal/misc/Unsafe +staticfield java/util/Properties hexDigit [C 16 +ciInstanceKlass java/lang/Module 1 1 907 10 9 10 9 9 9 10 10 10 10 7 10 10 7 11 7 10 10 9 10 10 8 10 10 10 9 11 9 10 9 10 10 100 100 10 10 8 10 10 10 10 10 10 9 10 10 9 10 10 9 11 7 10 9 9 10 7 7 10 100 8 10 10 10 8 10 10 10 10 8 8 10 10 10 18 10 11 9 11 10 100 8 10 7 10 10 11 11 9 11 10 10 9 10 10 10 10 18 11 10 11 10 11 4 10 7 10 11 7 10 11 7 10 7 8 10 10 7 10 10 7 7 10 9 100 10 11 10 10 10 11 7 10 11 10 11 10 10 10 10 10 10 10 10 18 11 11 18 10 10 10 7 10 10 10 9 7 10 10 10 10 10 10 10 10 10 9 18 10 7 100 8 10 10 10 100 10 100 8 100 10 100 100 3 10 100 10 10 10 100 10 10 100 100 10 8 10 10 10 10 10 10 10 7 10 10 10 100 8 10 10 8 10 8 10 10 10 8 10 7 10 10 10 11 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 100 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 1 7 12 12 1 12 12 7 12 100 12 12 12 1 12 12 12 12 12 12 7 12 12 100 12 12 1 1 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 1 1 12 1 1 12 12 1 12 12 12 12 1 1 12 12 12 1 15 16 15 16 12 12 12 12 12 7 12 1 1 1 12 12 12 12 12 12 12 12 12 12 7 12 16 15 16 12 12 100 12 12 12 12 12 1 12 1 12 1 7 12 100 1 1 1 12 12 1 12 12 1 1 12 12 1 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 16 15 16 12 12 12 15 16 12 12 12 12 1 12 12 12 12 1 12 12 12 12 12 12 12 16 15 16 12 100 12 1 1 1 12 12 12 1 12 1 1 1 1 1 12 1 12 12 12 1 12 12 1 1 12 1 12 12 100 12 12 12 12 12 1 12 12 1 1 12 100 12 1 12 1 12 12 12 1 1 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 1 1 1 1 1 10 1 1 1 1 1 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 12 12 100 12 12 12 1 1 100 1 1 1 100 1 1 +staticfield java/lang/Module ALL_UNNAMED_MODULE Ljava/lang/Module; java/lang/Module +staticfield java/lang/Module ALL_UNNAMED_MODULE_SET Ljava/util/Set; java/util/ImmutableCollections$Set12 +staticfield java/lang/Module EVERYONE_MODULE Ljava/lang/Module; java/lang/Module +staticfield java/lang/Module EVERYONE_SET Ljava/util/Set; java/util/ImmutableCollections$Set12 +staticfield java/lang/Module $assertionsDisabled Z 1 +instanceKlass java/lang/reflect/Executable +instanceKlass java/lang/reflect/Field +ciInstanceKlass java/lang/reflect/AccessibleObject 1 1 405 10 9 10 10 10 10 100 10 10 9 100 10 11 7 100 10 7 100 10 10 7 10 10 7 10 7 10 10 10 10 10 10 10 10 10 10 8 100 10 10 8 10 10 8 8 8 8 8 8 100 10 10 9 10 10 10 18 10 10 10 11 100 100 8 10 10 10 8 10 8 10 10 100 8 10 11 10 10 10 10 10 9 100 10 10 9 10 8 10 8 10 9 100 10 7 10 10 7 9 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 12 100 12 12 12 7 12 100 12 12 12 12 1 12 12 1 1 12 1 1 12 12 1 12 12 1 12 1 7 12 12 12 12 12 12 12 12 1 1 12 1 12 12 1 1 1 1 1 1 1 12 12 12 12 12 7 12 1 15 16 15 16 12 12 12 1 1 1 12 12 1 12 1 12 1 1 12 12 12 12 12 12 12 12 12 12 100 12 1 100 12 1 12 12 1 1 1 1 7 12 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 12 12 1 1 100 1 1 100 1 1 +staticfield java/lang/reflect/AccessibleObject reflectionFactory Ljdk/internal/reflect/ReflectionFactory; jdk/internal/reflect/ReflectionFactory +ciInstanceKlass java/lang/reflect/Field 1 1 433 9 10 10 10 9 10 10 10 10 9 9 9 9 9 9 9 100 8 10 7 10 9 9 10 10 10 10 10 10 7 10 10 10 10 10 10 10 100 10 8 10 10 8 10 10 8 8 10 11 9 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 10 10 10 10 10 9 10 10 10 10 11 10 100 10 10 9 10 11 10 10 9 10 10 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 100 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 12 12 100 12 100 12 12 12 12 100 12 12 12 12 12 12 12 12 12 1 1 12 1 12 12 12 12 7 12 12 12 12 12 1 12 12 12 12 12 12 1 1 12 12 1 12 12 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 7 12 12 100 12 12 12 1 100 12 7 12 12 7 12 7 12 12 12 100 12 100 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/lang/reflect/Parameter 0 0 226 10 9 9 9 9 100 10 10 10 100 10 10 11 10 10 10 10 10 8 8 10 10 10 8 10 8 10 9 10 9 10 10 10 10 10 10 10 10 11 10 100 10 10 10 10 10 9 100 10 11 11 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 12 12 12 12 12 1 12 12 100 12 1 12 12 12 100 12 12 12 12 1 1 12 12 12 1 1 12 12 12 12 12 12 12 12 12 100 12 12 100 12 12 1 100 12 12 12 12 12 12 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass java/lang/reflect/Constructor +instanceKlass java/lang/reflect/Method +ciInstanceKlass java/lang/reflect/Executable 1 1 458 10 10 10 11 10 10 10 10 10 7 8 100 10 10 10 100 8 10 10 10 10 8 8 10 10 100 8 10 8 10 8 11 10 10 11 10 8 8 10 10 100 10 10 10 10 10 10 100 10 10 10 10 10 100 10 100 8 10 10 3 100 8 10 10 10 10 10 8 8 8 9 10 100 8 9 10 10 10 10 10 10 7 10 10 100 10 100 10 10 11 10 10 10 9 10 7 10 10 9 10 10 9 10 9 10 9 7 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 100 100 1 1 1 1 1 1 1 1 1 1 1 1 12 7 12 12 7 12 7 12 12 12 12 12 1 1 1 12 12 1 1 12 7 12 12 12 1 1 12 1 1 12 1 12 1 100 12 12 12 1 1 12 12 1 12 12 7 12 12 12 1 12 12 12 12 100 12 12 1 1 12 12 1 1 12 12 12 12 1 1 1 12 12 1 1 12 12 12 12 12 12 12 12 12 1 100 12 1 7 12 12 12 12 100 12 12 12 12 1 12 12 100 12 100 12 12 12 12 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/lang/reflect/Method 1 1 441 9 10 10 9 10 10 10 10 9 9 9 9 9 9 9 9 9 9 9 100 8 10 7 10 9 8 10 10 10 10 10 10 10 100 10 10 10 7 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 8 10 100 8 10 10 10 10 10 10 10 11 9 10 10 10 10 11 10 7 10 10 10 10 9 10 10 10 10 10 11 10 7 100 100 10 10 10 100 10 8 10 10 10 10 10 8 10 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 100 100 7 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 7 12 7 12 12 12 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 1 1 12 1 12 12 1 7 12 7 12 12 12 12 12 12 1 12 12 7 12 12 7 12 12 12 12 12 100 12 12 12 12 12 12 12 1 1 1 1 12 12 12 12 12 12 12 100 12 12 12 12 12 12 12 1 12 12 12 12 12 7 12 12 7 12 7 12 7 12 7 12 7 12 1 1 1 12 12 12 1 1 12 12 12 12 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/lang/reflect/Constructor 1 1 415 10 10 9 10 10 10 9 10 9 9 9 9 9 9 9 9 100 8 10 7 10 9 10 10 10 10 10 7 100 8 10 10 10 10 10 100 10 7 10 10 10 10 10 10 10 10 10 100 8 10 10 100 8 10 10 10 10 10 10 10 9 10 10 100 8 10 11 10 10 10 9 10 10 10 10 10 10 10 10 10 100 8 10 10 10 10 10 10 10 11 9 10 10 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 12 7 12 12 12 12 7 12 12 12 12 12 12 12 12 12 12 12 1 1 12 1 12 12 7 12 7 12 12 12 12 1 1 1 12 12 12 12 1 7 12 12 7 12 12 100 12 12 12 12 12 1 1 12 1 1 12 12 12 12 12 12 12 12 12 12 1 1 12 12 12 12 12 12 7 12 12 12 12 12 12 12 12 12 1 1 12 12 12 12 100 12 100 12 100 12 100 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 +instanceKlass jdk/internal/reflect/FieldAccessorImpl +instanceKlass jdk/internal/reflect/ConstructorAccessorImpl +instanceKlass jdk/internal/reflect/MethodAccessorImpl +ciInstanceKlass jdk/internal/reflect/MagicAccessorImpl 1 1 16 10 100 7 1 1 1 1 1 1 1 1 1 12 1 1 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor14 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor13 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor12 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor11 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor10 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor9 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor8 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor7 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor6 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor5 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor4 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor3 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor2 +instanceKlass jdk/internal/reflect/GeneratedMethodAccessor1 +instanceKlass jdk/internal/reflect/DelegatingMethodAccessorImpl +instanceKlass jdk/internal/reflect/NativeMethodAccessorImpl +ciInstanceKlass jdk/internal/reflect/MethodAccessorImpl 1 1 25 10 100 7 100 1 1 1 1 1 1 1 1 1 1 100 100 1 1 12 1 1 1 1 1 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor25 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor24 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor23 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor22 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor21 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor20 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor19 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor18 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor17 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor16 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor15 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor14 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor13 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor12 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor11 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor10 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor9 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor8 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor7 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor6 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor5 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor4 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor3 +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor2 +instanceKlass jdk/internal/reflect/BootstrapConstructorAccessorImpl +instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor1 +instanceKlass jdk/internal/reflect/DelegatingConstructorAccessorImpl +instanceKlass jdk/internal/reflect/NativeConstructorAccessorImpl +ciInstanceKlass jdk/internal/reflect/ConstructorAccessorImpl 1 1 27 10 100 7 100 1 1 1 1 1 1 1 1 1 1 100 100 100 1 1 12 1 1 1 1 1 1 +ciInstanceKlass jdk/internal/reflect/DelegatingClassLoader 1 1 18 10 100 7 1 1 1 1 1 1 1 1 1 1 1 12 1 1 +ciInstanceKlass jdk/internal/reflect/ConstantPool 1 1 138 10 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 7 7 8 10 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 1 7 12 1 1 1 1 1 1 1 +instanceKlass jdk/internal/reflect/UnsafeFieldAccessorImpl +ciInstanceKlass jdk/internal/reflect/FieldAccessorImpl 1 1 59 10 100 7 100 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 1 1 1 1 +instanceKlass jdk/internal/reflect/UnsafeStaticFieldAccessorImpl +ciInstanceKlass jdk/internal/reflect/UnsafeFieldAccessorImpl 1 1 254 10 9 10 10 9 10 9 10 10 9 10 10 10 10 100 10 10 10 8 10 10 100 8 10 8 10 8 10 100 10 10 8 10 8 10 8 10 8 10 8 10 8 10 8 10 8 10 8 10 10 8 8 8 8 8 8 10 8 8 8 10 10 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 7 12 12 7 12 12 12 12 12 12 12 100 12 12 1 12 12 1 12 1 1 12 1 12 1 12 1 12 1 12 1 100 12 1 100 12 1 100 12 1 100 12 1 100 12 1 100 12 1 100 12 1 100 12 12 1 1 1 1 1 1 12 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield jdk/internal/reflect/UnsafeFieldAccessorImpl unsafe Ljdk/internal/misc/Unsafe; jdk/internal/misc/Unsafe +instanceKlass jdk/internal/reflect/UnsafeStaticIntegerFieldAccessorImpl +instanceKlass jdk/internal/reflect/UnsafeQualifiedStaticFieldAccessorImpl +ciInstanceKlass jdk/internal/reflect/UnsafeStaticFieldAccessorImpl 1 1 43 10 9 10 9 7 7 8 10 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 7 12 12 1 1 7 12 1 1 1 1 1 1 1 1 1 +ciInstanceKlass jdk/internal/reflect/CallerSensitive 0 0 17 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass java/lang/invoke/DelegatingMethodHandle +instanceKlass java/lang/invoke/BoundMethodHandle +instanceKlass java/lang/invoke/DirectMethodHandle +ciInstanceKlass java/lang/invoke/MethodHandle 1 1 489 9 10 10 7 7 10 9 10 10 10 10 10 10 11 10 10 10 9 10 100 100 10 8 10 10 8 10 10 10 10 10 10 10 10 10 10 7 10 10 10 8 10 8 10 10 10 10 8 10 8 10 8 10 9 100 10 9 9 8 10 10 10 10 10 10 10 10 10 10 10 8 10 8 10 10 10 10 10 9 8 10 10 8 10 10 10 10 10 100 8 10 10 9 10 7 10 10 9 10 10 8 9 9 9 10 10 10 10 7 10 8 10 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 7 12 1 1 12 12 12 12 12 100 12 12 12 100 12 12 12 12 12 12 1 1 1 12 12 1 12 12 7 12 12 12 12 12 12 12 100 12 1 12 12 12 1 7 12 1 12 12 12 12 1 12 1 12 1 100 12 12 1 100 12 100 1 12 12 12 12 12 12 12 12 12 12 12 1 12 1 12 12 12 12 12 12 1 12 12 1 12 12 7 12 12 1 1 12 12 12 1 100 12 12 12 12 12 1 12 12 12 7 12 12 12 12 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/invoke/MethodHandle FORM_OFFSET J 20 +staticfield java/lang/invoke/MethodHandle $assertionsDisabled Z 1 +instanceKlass java/lang/invoke/DirectMethodHandle$Interface +instanceKlass java/lang/invoke/DirectMethodHandle$Special +instanceKlass java/lang/invoke/DirectMethodHandle$Constructor +instanceKlass java/lang/invoke/DirectMethodHandle$Accessor +ciInstanceKlass java/lang/invoke/DirectMethodHandle 1 1 922 7 7 100 7 7 10 10 100 10 10 10 10 10 10 7 7 10 10 10 10 10 10 9 100 10 9 10 10 10 10 10 10 7 10 10 10 8 10 7 10 7 10 10 10 10 10 10 100 10 10 7 10 10 10 10 8 10 10 10 10 10 9 7 10 10 10 100 10 8 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 8 9 8 9 9 8 9 9 8 9 9 8 10 10 7 9 7 10 100 10 10 10 10 7 10 10 10 7 10 10 10 10 10 9 10 9 9 10 10 7 7 7 9 10 10 10 10 9 10 100 10 100 10 10 8 9 9 10 9 10 9 9 10 10 10 10 10 10 10 9 10 10 10 10 10 9 10 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 8 9 9 10 100 10 9 10 7 9 10 10 10 10 10 8 8 8 8 10 9 10 7 10 8 9 10 8 8 8 9 8 8 8 8 8 8 7 8 10 10 8 8 10 10 10 10 7 7 1 1 1 1 1 1 1 100 1 1 1 1 7 1 1 1 1 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 12 12 1 12 12 12 12 12 12 1 1 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 1 12 12 12 1 12 1 12 1 12 12 12 12 12 1 12 12 1 12 12 12 12 12 12 12 12 12 7 12 1 12 7 12 12 1 1 12 12 12 12 12 12 12 12 12 12 12 12 7 12 12 12 12 12 1 12 1 12 12 1 12 12 1 12 12 1 12 12 1 12 1 12 1 12 12 12 12 1 12 12 12 12 7 12 12 12 12 12 12 12 7 12 12 1 1 1 12 12 12 12 12 12 12 1 12 1 12 12 1 12 12 12 12 100 12 12 12 12 12 12 12 12 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 1 12 7 12 1 12 12 12 12 12 1 1 1 1 12 12 12 1 100 12 12 12 12 1 1 12 12 1 12 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/invoke/DirectMethodHandle IMPL_NAMES Ljava/lang/invoke/MemberName$Factory; java/lang/invoke/MemberName$Factory +staticfield java/lang/invoke/DirectMethodHandle FT_UNCHECKED_REF I 8 +staticfield java/lang/invoke/DirectMethodHandle ACCESSOR_FORMS [Ljava/lang/invoke/LambdaForm; 132 [Ljava/lang/invoke/LambdaForm; +staticfield java/lang/invoke/DirectMethodHandle ALL_WRAPPERS [Lsun/invoke/util/Wrapper; 10 [Lsun/invoke/util/Wrapper; +staticfield java/lang/invoke/DirectMethodHandle NFS [Ljava/lang/invoke/LambdaForm$NamedFunction; 12 [Ljava/lang/invoke/LambdaForm$NamedFunction; +staticfield java/lang/invoke/DirectMethodHandle OBJ_OBJ_TYPE Ljava/lang/invoke/MethodType; java/lang/invoke/MethodType +staticfield java/lang/invoke/DirectMethodHandle LONG_OBJ_TYPE Ljava/lang/invoke/MethodType; java/lang/invoke/MethodType +staticfield java/lang/invoke/DirectMethodHandle $assertionsDisabled Z 1 +instanceKlass java/lang/invoke/VarHandleObjects$Array +instanceKlass java/lang/invoke/VarHandleObjects$FieldInstanceReadOnly +instanceKlass java/lang/invoke/VarHandleInts$FieldInstanceReadOnly +ciInstanceKlass java/lang/invoke/VarHandle 1 1 298 10 9 100 10 9 10 10 10 9 10 10 9 9 10 10 10 10 10 10 10 9 100 10 9 10 10 7 7 10 10 10 9 10 9 10 10 10 100 10 9 9 10 10 10 10 10 10 10 7 10 10 9 8 10 7 10 7 100 1 1 100 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 100 12 12 1 12 12 12 1 1 12 100 12 12 12 12 12 12 12 12 1 7 12 12 7 12 12 12 12 12 12 12 1 7 12 12 12 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/invoke/VarHandle AIOOBE_SUPPLIER Ljava/util/function/BiFunction; jdk/internal/util/Preconditions$1 +staticfield java/lang/invoke/VarHandle VFORM_OFFSET J 12 +staticfield java/lang/invoke/VarHandle $assertionsDisabled Z 1 +ciInstanceKlass java/lang/invoke/MemberName 1 1 747 7 7 100 9 10 9 10 10 10 10 10 10 10 9 10 100 100 10 8 10 10 10 10 9 8 10 7 7 10 10 100 100 7 10 9 100 8 10 10 10 10 10 10 10 10 10 10 8 8 8 10 10 9 3 10 10 10 10 10 10 10 10 10 7 8 10 10 8 9 8 9 10 8 10 10 10 10 10 100 10 10 8 10 10 8 10 10 100 10 10 8 8 100 10 10 100 10 10 10 10 10 10 10 10 10 3 10 3 10 3 3 3 3 3 3 100 10 10 10 3 9 10 3 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 10 10 10 100 10 10 10 10 10 10 8 10 10 10 10 10 10 10 10 10 10 10 10 10 100 10 100 8 10 7 10 10 10 10 10 8 8 8 8 10 10 10 8 8 10 8 10 10 10 8 8 10 10 8 10 8 10 10 10 8 8 8 100 10 8 8 8 8 10 100 100 100 10 100 10 100 10 9 10 100 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 3 1 3 1 3 1 1 1 1 1 1 1 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 100 1 1 1 1 1 1 1 1 1 7 1 1 12 12 12 12 12 12 12 12 12 12 100 12 12 1 1 12 1 12 12 12 12 12 1 100 12 1 1 12 1 12 12 1 1 12 12 12 12 12 12 12 12 12 12 1 1 1 100 12 12 12 12 12 12 12 12 12 12 12 1 12 12 100 100 12 1 12 12 12 12 12 1 12 12 1 12 12 1 12 12 1 12 12 1 1 1 12 100 12 1 12 12 12 12 12 12 12 12 12 12 100 1 12 7 12 12 12 12 12 7 12 12 12 12 12 12 12 12 12 1 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 1 1 1 12 12 12 12 12 1 1 1 1 12 12 12 1 1 12 1 12 12 1 1 12 1 12 1 12 12 12 1 1 1 1 1 1 1 1 12 1 1 1 1 1 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/invoke/MemberName $assertionsDisabled Z 1 +ciInstanceKlass java/lang/invoke/ResolvedMethodName 1 1 16 10 100 100 1 1 1 1 1 1 1 1 1 12 1 1 +ciInstanceKlass java/lang/invoke/MethodHandleNatives 1 1 660 100 10 9 10 100 10 10 10 10 8 8 8 8 8 8 8 8 8 8 7 10 7 10 10 7 10 10 8 10 8 10 8 10 9 8 10 100 10 100 100 8 7 7 10 10 7 9 10 10 10 7 10 10 10 10 10 9 8 10 8 10 8 8 8 100 10 8 10 10 10 100 8 10 7 8 10 8 8 8 8 8 10 10 10 10 10 7 10 100 100 10 10 8 8 10 10 10 8 10 8 8 10 10 100 10 7 9 10 10 10 9 10 9 9 10 10 10 7 7 10 10 10 10 10 8 10 10 10 10 10 10 100 8 10 9 10 10 100 10 10 100 100 10 10 100 100 10 100 10 10 10 10 10 10 10 10 10 10 10 10 8 100 10 10 10 10 10 10 7 10 10 10 10 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 1 12 12 12 1 1 1 1 1 1 1 1 1 1 1 12 1 12 12 1 12 1 12 1 12 1 12 100 12 1 100 12 1 12 1 1 1 1 1 12 1 7 12 12 12 12 1 12 7 12 12 12 12 12 1 12 1 12 1 1 1 1 12 1 12 12 100 12 1 100 12 1 1 12 1 1 1 1 1 12 12 12 12 12 1 12 1 1 12 12 1 1 12 12 1 100 12 1 1 12 12 1 12 1 12 7 12 12 12 12 12 12 12 12 12 1 1 12 12 12 7 12 12 1 12 12 12 12 7 12 12 1 1 12 12 12 1 12 12 1 1 1 1 1 12 12 12 12 12 12 12 12 12 1 1 12 12 12 12 12 12 1 12 12 12 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/invoke/MethodHandleNatives $assertionsDisabled Z 1 +ciInstanceKlass java/lang/invoke/LambdaForm 1 1 1075 100 9 10 10 9 9 10 100 10 9 10 9 10 7 9 9 9 9 10 7 10 7 10 10 10 10 10 10 9 100 10 9 10 10 10 10 10 7 10 10 8 10 10 10 7 10 10 7 10 10 9 9 9 10 9 10 10 100 10 9 10 10 100 10 10 10 10 10 10 10 8 10 10 8 8 9 9 9 10 10 10 9 10 10 10 10 10 10 9 10 8 8 8 8 8 8 8 8 10 9 7 10 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 8 10 10 10 10 8 10 8 8 10 9 10 10 100 10 10 10 10 9 8 10 10 10 10 10 9 8 10 100 10 10 9 9 8 10 10 100 100 10 10 8 8 100 8 10 10 10 8 8 9 10 10 8 8 8 100 8 100 8 100 8 10 8 9 10 10 9 10 10 10 10 10 10 10 10 10 10 8 100 10 10 9 10 8 8 100 8 8 8 8 8 8 8 8 10 10 10 10 8 8 8 10 8 10 8 8 8 8 8 10 10 10 10 10 10 10 10 10 10 10 9 8 10 9 10 9 9 9 9 7 10 9 10 10 7 8 10 9 7 10 8 100 10 9 9 10 7 10 10 10 9 10 10 10 9 10 10 10 9 10 9 7 9 10 9 10 100 10 7 9 100 1 1 100 1 100 1 1 1 7 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 3 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1 12 12 12 12 12 12 1 12 12 12 7 12 12 12 12 12 12 1 12 1 12 12 100 12 100 12 12 12 12 1 12 12 12 12 12 12 12 1 12 1 12 12 12 1 12 12 1 12 12 12 12 12 12 12 12 12 1 12 12 12 12 1 12 12 12 12 12 12 12 1 12 12 1 1 12 12 12 12 7 12 12 12 7 12 12 12 12 12 12 12 1 1 1 1 1 1 1 1 12 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 1 12 12 12 1 12 1 1 12 12 12 12 1 12 12 7 12 12 12 1 100 12 12 12 12 12 12 1 12 12 7 12 12 1 12 12 1 1 12 1 1 1 1 12 12 12 1 1 12 12 12 1 1 1 1 1 1 1 1 1 12 1 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 1 1 1 12 1 12 1 1 1 1 1 12 12 12 7 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 1 7 12 12 12 12 1 1 12 12 1 12 1 1 12 12 12 12 1 12 7 12 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/invoke/LambdaForm COMPILE_THRESHOLD I 0 +staticfield java/lang/invoke/LambdaForm INTERNED_ARGUMENTS [[Ljava/lang/invoke/LambdaForm$Name; 5 [[Ljava/lang/invoke/LambdaForm$Name; +staticfield java/lang/invoke/LambdaForm IMPL_NAMES Ljava/lang/invoke/MemberName$Factory; java/lang/invoke/MemberName$Factory +staticfield java/lang/invoke/LambdaForm LF_identity [Ljava/lang/invoke/LambdaForm; 6 [Ljava/lang/invoke/LambdaForm; +staticfield java/lang/invoke/LambdaForm LF_zero [Ljava/lang/invoke/LambdaForm; 6 [Ljava/lang/invoke/LambdaForm; +staticfield java/lang/invoke/LambdaForm NF_identity [Ljava/lang/invoke/LambdaForm$NamedFunction; 6 [Ljava/lang/invoke/LambdaForm$NamedFunction; +staticfield java/lang/invoke/LambdaForm NF_zero [Ljava/lang/invoke/LambdaForm$NamedFunction; 6 [Ljava/lang/invoke/LambdaForm$NamedFunction; +staticfield java/lang/invoke/LambdaForm createFormsLock Ljava/lang/Object; java/lang/Object +staticfield java/lang/invoke/LambdaForm DEBUG_NAME_COUNTERS Ljava/util/HashMap; null +staticfield java/lang/invoke/LambdaForm DEBUG_NAMES Ljava/util/HashMap; null +staticfield java/lang/invoke/LambdaForm TRACE_INTERPRETER Z 0 +staticfield java/lang/invoke/LambdaForm $assertionsDisabled Z 1 +ciInstanceKlass java/lang/invoke/MethodType 1 1 674 7 10 9 9 9 10 9 8 10 10 9 9 10 100 10 8 10 10 10 100 8 10 100 10 10 10 10 11 9 11 7 7 10 10 9 10 10 10 10 10 10 9 7 10 100 10 10 10 10 10 10 10 10 10 8 8 10 9 100 10 10 10 10 10 10 10 10 10 8 10 10 10 10 10 10 10 10 10 9 10 10 10 10 9 7 10 10 10 10 10 10 10 10 100 8 8 8 10 10 10 10 11 11 10 9 10 10 10 10 10 10 10 10 10 10 10 10 9 7 10 10 10 10 10 10 10 8 10 11 9 10 10 10 10 10 9 9 10 9 10 10 100 10 7 10 7 7 9 100 1 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 100 100 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 100 1 12 12 12 12 7 12 7 12 1 100 12 12 7 7 12 1 1 12 12 12 1 1 12 1 12 12 12 12 12 12 1 7 12 12 12 12 12 12 7 12 12 12 12 1 12 1 12 12 7 12 12 12 12 12 12 12 1 1 12 12 1 12 12 12 12 100 12 12 12 1 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 7 12 12 7 12 12 12 1 1 1 1 12 12 12 12 12 100 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 1 7 12 12 12 12 12 100 12 12 12 12 12 100 12 12 100 12 12 12 1 1 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/invoke/MethodType internTable Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet; java/lang/invoke/MethodType$ConcurrentWeakInternSet +staticfield java/lang/invoke/MethodType NO_PTYPES [Ljava/lang/Class; 0 [Ljava/lang/Class; +staticfield java/lang/invoke/MethodType objectOnlyTypes [Ljava/lang/invoke/MethodType; 20 [Ljava/lang/invoke/MethodType; +staticfield java/lang/invoke/MethodType METHOD_HANDLE_ARRAY [Ljava/lang/Class; 1 [Ljava/lang/Class; +staticfield java/lang/invoke/MethodType serialPersistentFields [Ljava/io/ObjectStreamField; 0 [Ljava/io/ObjectStreamField; +staticfield java/lang/invoke/MethodType $assertionsDisabled Z 1 +ciInstanceKlass java/lang/BootstrapMethodError 0 0 45 10 10 10 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 12 12 12 12 12 1 1 1 1 1 1 1 1 +instanceKlass java/lang/invoke/VolatileCallSite +instanceKlass java/lang/invoke/MutableCallSite +instanceKlass java/lang/invoke/ConstantCallSite +ciInstanceKlass java/lang/invoke/CallSite 1 1 299 10 10 9 10 9 10 10 100 7 10 7 10 10 10 100 100 10 10 10 8 10 10 10 10 10 10 10 10 9 9 7 8 10 10 100 10 9 8 100 10 10 100 8 10 10 10 100 10 10 10 10 10 9 9 8 10 9 100 10 10 10 10 10 10 100 8 10 10 100 100 100 8 10 10 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 7 1 1 1 1 1 1 12 12 12 12 12 12 12 1 1 12 1 12 12 12 1 1 12 12 1 12 12 12 12 12 100 12 12 12 100 12 1 12 12 1 100 12 12 12 12 1 1 12 12 1 12 12 12 12 12 12 12 100 12 12 1 100 12 12 12 12 7 12 1 1 12 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/invoke/CallSite $assertionsDisabled Z 1 +ciInstanceKlass java/lang/invoke/MethodHandleNatives$CallSiteContext 1 1 49 10 7 10 10 10 10 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 12 1 7 12 7 12 12 1 1 1 1 1 1 1 1 100 1 1 1 1 1 +ciInstanceKlass java/lang/invoke/ConstantCallSite 1 1 49 10 9 10 100 10 9 100 10 10 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 12 12 12 1 12 12 1 12 1 1 1 1 +ciInstanceKlass java/lang/invoke/MutableCallSite 0 0 67 10 10 9 10 10 10 9 10 10 100 10 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 12 12 12 12 12 12 12 12 100 12 1 12 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/lang/invoke/VolatileCallSite 0 0 41 10 10 10 10 10 10 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 1 1 1 1 1 1 1 +ciInstanceKlass java/lang/AssertionStatusDirectives 0 0 24 10 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 1 +instanceKlass java/lang/StringBuilder +instanceKlass java/lang/StringBuffer +ciInstanceKlass java/lang/AbstractStringBuilder 1 1 522 7 7 10 9 9 9 9 10 9 10 10 10 10 10 10 10 10 7 3 10 3 100 10 10 100 10 10 10 10 10 10 10 100 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 10 10 8 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 18 100 10 18 10 10 10 11 10 10 10 100 10 8 10 10 8 8 10 10 10 10 100 10 100 10 100 10 7 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 12 12 12 12 12 7 12 12 12 7 12 12 12 12 12 7 12 1 12 1 12 1 12 12 12 12 12 12 1 12 100 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 7 12 12 12 100 12 12 12 12 12 12 12 12 12 100 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 15 16 15 16 12 1 100 12 15 12 12 12 12 12 12 1 1 12 12 1 1 12 12 12 1 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 10 1 1 1 1 1 10 1 1 1 1 1 1 1 1 1 1 100 12 12 12 1 1 100 1 1 100 1 1 +staticfield java/lang/AbstractStringBuilder EMPTYVALUE [B 0 +ciInstanceKlass java/lang/StringBuffer 1 1 466 10 10 10 11 10 10 10 9 10 10 10 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 9 10 10 100 10 10 10 10 10 8 10 8 10 8 10 10 10 10 7 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 7 10 7 10 9 9 9 7 100 100 100 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 100 1 1 1 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 7 12 100 1 12 100 12 12 1 12 1 12 1 12 12 100 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 1 12 7 12 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/StringBuffer serialPersistentFields [Ljava/io/ObjectStreamField; 3 [Ljava/io/ObjectStreamField; +ciInstanceKlass java/lang/StringBuilder 1 1 403 10 10 10 11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 9 9 10 10 10 10 10 10 10 10 10 10 10 100 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 7 10 7 100 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 7 12 100 100 12 12 12 12 12 100 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass jdk/internal/misc/Unsafe 1 1 1165 10 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 10 10 10 5 0 10 10 10 10 10 10 10 10 10 100 10 10 10 10 10 10 10 10 10 10 10 10 10 10 5 0 5 0 5 0 10 10 10 100 10 10 10 10 10 10 10 10 10 100 10 10 10 10 8 10 8 8 10 9 9 9 9 9 9 9 9 10 10 10 10 5 0 5 0 9 10 10 10 10 10 8 3 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 10 100 10 9 5 0 10 5 0 10 5 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 5 0 5 0 5 0 10 10 10 10 10 7 10 7 10 9 7 9 7 9 7 9 7 9 7 9 7 9 7 9 7 9 10 9 9 9 9 9 9 9 9 9 10 10 10 7 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 12 1 12 12 12 1 12 1 1 12 7 12 100 7 100 100 100 100 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 1 12 12 12 1 12 1 12 1 12 1 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield jdk/internal/misc/Unsafe theUnsafe Ljdk/internal/misc/Unsafe; jdk/internal/misc/Unsafe +staticfield jdk/internal/misc/Unsafe ARRAY_BOOLEAN_BASE_OFFSET I 16 +staticfield jdk/internal/misc/Unsafe ARRAY_BYTE_BASE_OFFSET I 16 +staticfield jdk/internal/misc/Unsafe ARRAY_SHORT_BASE_OFFSET I 16 +staticfield jdk/internal/misc/Unsafe ARRAY_CHAR_BASE_OFFSET I 16 +staticfield jdk/internal/misc/Unsafe ARRAY_INT_BASE_OFFSET I 16 +staticfield jdk/internal/misc/Unsafe ARRAY_LONG_BASE_OFFSET I 16 +staticfield jdk/internal/misc/Unsafe ARRAY_FLOAT_BASE_OFFSET I 16 +staticfield jdk/internal/misc/Unsafe ARRAY_DOUBLE_BASE_OFFSET I 16 +staticfield jdk/internal/misc/Unsafe ARRAY_OBJECT_BASE_OFFSET I 16 +staticfield jdk/internal/misc/Unsafe ARRAY_BOOLEAN_INDEX_SCALE I 1 +staticfield jdk/internal/misc/Unsafe ARRAY_BYTE_INDEX_SCALE I 1 +staticfield jdk/internal/misc/Unsafe ARRAY_SHORT_INDEX_SCALE I 2 +staticfield jdk/internal/misc/Unsafe ARRAY_CHAR_INDEX_SCALE I 2 +staticfield jdk/internal/misc/Unsafe ARRAY_INT_INDEX_SCALE I 4 +staticfield jdk/internal/misc/Unsafe ARRAY_LONG_INDEX_SCALE I 8 +staticfield jdk/internal/misc/Unsafe ARRAY_FLOAT_INDEX_SCALE I 4 +staticfield jdk/internal/misc/Unsafe ARRAY_DOUBLE_INDEX_SCALE I 8 +staticfield jdk/internal/misc/Unsafe ARRAY_OBJECT_INDEX_SCALE I 4 +staticfield jdk/internal/misc/Unsafe ADDRESS_SIZE I 8 +staticfield jdk/internal/misc/Unsafe BE Z 0 +staticfield jdk/internal/misc/Unsafe unalignedAccess Z 1 +ciInstanceKlass jdk/internal/module/Modules 1 1 483 10 9 11 11 11 11 11 11 11 11 10 10 18 10 100 10 10 10 10 11 10 10 10 10 9 10 10 10 100 100 11 10 11 10 10 10 10 10 11 18 11 10 11 100 11 11 11 10 10 18 11 18 11 10 18 18 10 9 11 100 10 11 11 100 11 10 100 10 10 10 11 10 100 10 18 10 100 8 10 10 18 11 11 10 10 10 18 10 10 7 10 10 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 100 100 100 100 100 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 12 12 7 12 12 12 12 12 12 12 12 12 100 12 1 15 16 15 16 12 100 12 1 100 12 100 12 12 12 12 12 12 12 12 12 100 12 1 1 12 100 12 12 12 12 100 12 12 12 12 16 15 16 12 12 100 12 100 12 1 12 12 12 12 100 12 16 15 16 12 12 16 15 16 12 12 12 15 16 15 16 12 12 12 1 12 12 1 12 1 12 12 12 12 12 1 15 16 12 12 1 1 12 12 15 16 12 12 12 15 12 1 12 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 1 1 1 1 1 10 1 1 1 1 1 1 10 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 1 1 1 1 10 1 1 10 1 1 1 1 1 100 12 12 12 12 12 12 12 12 12 1 1 100 1 1 1 1 1 100 1 1 +staticfield jdk/internal/module/Modules JLA Ljdk/internal/misc/JavaLangAccess; java/lang/System$2 +staticfield jdk/internal/module/Modules $assertionsDisabled Z 1 +instanceKlass org/jetbrains/kotlin/protobuf/RopeByteString$RopeInputStream +instanceKlass org/jetbrains/kotlin/com/intellij/util/io/UnsyncByteArrayInputStream +instanceKlass jdk/nio/zipfs/ZipFileSystem$EntryInputStream +instanceKlass java/io/ObjectInputStream$PeekInputStream +instanceKlass java/io/ObjectInputStream$BlockDataInputStream +instanceKlass java/io/ObjectInputStream +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/RopeByteString$RopeInputStream +instanceKlass java/util/zip/ZipFile$ZipFileInputStream +instanceKlass java/io/FilterInputStream +instanceKlass java/io/FileInputStream +instanceKlass java/io/ByteArrayInputStream +ciInstanceKlass java/io/InputStream 1 1 170 100 10 100 10 10 10 10 100 3 10 100 8 10 7 10 3 100 8 10 100 10 11 10 11 11 11 100 10 5 0 10 8 10 8 10 10 7 100 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 12 7 12 12 1 12 1 1 12 1 100 12 1 1 1 12 100 12 12 12 12 100 12 12 1 12 100 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/io/ByteArrayInputStream 1 1 96 10 9 9 9 9 10 10 10 10 10 10 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 100 12 7 12 7 12 100 12 12 100 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/net/URL 1 1 735 10 10 10 9 9 10 10 10 9 10 8 10 100 10 10 8 10 9 100 8 10 10 8 9 10 9 10 10 9 9 8 9 10 8 9 10 10 8 10 7 10 10 10 10 10 8 10 10 8 9 8 10 10 100 10 10 10 100 8 10 10 8 10 10 10 10 10 10 8 10 7 10 10 10 9 10 9 10 10 10 10 10 10 7 10 10 10 100 10 10 8 9 10 10 9 10 100 10 10 10 10 10 10 10 10 10 10 10 9 9 100 8 10 10 9 10 8 10 8 10 10 8 8 10 100 10 10 10 7 100 10 9 10 8 10 100 10 10 8 9 10 10 10 10 10 11 10 10 9 10 10 10 8 10 7 100 10 8 8 10 8 8 8 10 100 10 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 8 10 10 10 10 10 8 7 10 7 10 7 10 7 7 10 9 9 7 10 10 100 1 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 100 12 12 12 12 12 1 12 1 12 1 12 12 1 1 12 12 1 12 12 12 12 12 12 12 1 12 12 1 12 12 7 12 1 12 1 12 12 12 12 12 1 12 12 1 12 1 12 12 1 12 12 12 1 1 12 1 12 12 12 12 12 12 1 12 1 7 12 12 100 12 12 12 12 12 12 12 12 12 1 12 1 12 12 1 12 100 12 12 100 12 12 1 12 12 12 12 100 12 12 12 7 12 12 12 12 12 1 1 12 12 12 1 7 12 1 12 12 1 1 12 1 100 12 12 12 1 1 12 12 1 12 1 100 12 100 12 12 12 12 12 7 12 12 12 12 12 12 100 12 12 12 1 1 12 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 1 12 12 12 1 1 1 1 1 1 12 7 12 12 1 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/net/URL defaultFactory Ljava/net/URLStreamHandlerFactory; java/net/URL$DefaultFactory +staticfield java/net/URL streamHandlerLock Ljava/lang/Object; java/lang/Object +staticfield java/net/URL serialPersistentFields [Ljava/io/ObjectStreamField; 7 [Ljava/io/ObjectStreamField; +ciInstanceKlass java/util/jar/Manifest 1 1 299 10 7 10 9 7 10 9 9 10 10 10 10 10 11 11 10 10 100 100 10 8 10 10 10 10 11 100 10 10 11 11 11 11 100 100 8 10 11 100 8 10 10 10 10 8 10 10 11 10 10 10 8 10 7 10 10 10 100 8 10 10 8 10 10 10 10 11 10 10 10 100 7 10 11 10 11 10 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 12 1 12 12 12 12 12 12 12 7 12 12 100 12 1 1 1 12 12 12 12 1 12 12 12 100 12 12 12 1 1 1 12 1 1 12 12 12 12 1 12 12 12 12 12 1 12 1 12 12 12 1 1 12 1 12 100 12 12 12 12 12 100 12 12 1 1 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass jdk/internal/loader/ClassLoaders 1 1 143 10 9 9 9 7 11 100 11 11 10 10 100 100 10 9 8 10 7 10 7 10 10 7 10 8 10 8 8 7 10 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 1 100 12 1 12 12 100 12 100 12 1 1 7 12 12 1 7 12 1 12 1 12 12 1 12 1 7 12 1 1 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield jdk/internal/loader/ClassLoaders JLA Ljdk/internal/misc/JavaLangAccess; java/lang/System$2 +staticfield jdk/internal/loader/ClassLoaders BOOT_LOADER Ljdk/internal/loader/ClassLoaders$BootClassLoader; jdk/internal/loader/ClassLoaders$BootClassLoader +staticfield jdk/internal/loader/ClassLoaders PLATFORM_LOADER Ljdk/internal/loader/ClassLoaders$PlatformClassLoader; jdk/internal/loader/ClassLoaders$PlatformClassLoader +staticfield jdk/internal/loader/ClassLoaders APP_LOADER Ljdk/internal/loader/ClassLoaders$AppClassLoader; jdk/internal/loader/ClassLoaders$AppClassLoader +instanceKlass jdk/internal/loader/ClassLoaders$BootClassLoader +instanceKlass jdk/internal/loader/ClassLoaders$PlatformClassLoader +instanceKlass jdk/internal/loader/ClassLoaders$AppClassLoader +ciInstanceKlass jdk/internal/loader/BuiltinClassLoader 1 1 717 10 10 9 9 7 10 9 9 10 10 11 100 100 10 10 8 10 10 7 10 10 11 11 11 7 9 8 8 10 10 9 11 7 10 10 10 10 10 10 10 11 10 100 10 10 10 100 8 10 10 8 10 10 11 11 7 7 10 11 11 10 7 10 10 7 7 10 7 7 10 10 100 10 11 100 100 10 10 100 100 10 10 18 10 10 18 100 10 7 10 10 10 10 10 9 100 10 10 10 10 10 10 10 10 10 10 18 7 10 10 10 10 100 10 7 10 10 10 11 7 10 7 100 10 10 11 10 10 10 10 10 10 10 10 8 10 10 10 100 8 8 10 10 8 8 10 11 9 10 9 9 9 9 9 9 10 8 10 7 10 10 7 7 10 11 10 10 10 100 10 10 10 7 10 10 8 10 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 7 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 7 12 12 12 12 1 12 12 12 12 12 12 1 1 12 1 12 12 1 12 12 7 12 12 12 1 12 1 1 12 7 12 12 12 1 12 12 12 7 12 12 12 12 12 7 12 1 7 12 12 1 1 12 1 12 12 12 12 1 1 12 12 1 12 12 1 1 12 1 1 12 7 12 1 12 12 1 1 12 12 1 1 12 12 1 15 16 15 16 12 12 12 15 16 1 7 12 1 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 15 16 12 1 12 12 12 12 1 12 100 1 1 12 12 12 12 1 12 1 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 1 1 1 12 1 1 7 12 7 12 7 12 12 12 12 12 12 12 12 12 1 12 1 12 12 1 1 12 12 12 12 1 12 12 1 12 12 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 10 1 1 1 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 12 12 12 1 1 100 1 1 100 1 1 +staticfield jdk/internal/loader/BuiltinClassLoader packageToModule Ljava/util/Map; java/util/concurrent/ConcurrentHashMap +staticfield jdk/internal/loader/BuiltinClassLoader $assertionsDisabled Z 1 +ciInstanceKlass jdk/internal/loader/ClassLoaders$AppClassLoader 1 1 134 8 10 9 10 10 10 10 10 10 7 8 10 10 10 9 11 10 10 100 10 7 7 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 12 12 7 12 100 12 12 12 12 12 1 1 12 7 12 100 12 12 100 12 12 7 12 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass jdk/internal/loader/ClassLoaders$PlatformClassLoader 1 1 57 8 10 9 11 10 100 10 100 7 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 12 12 100 12 7 12 1 12 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/security/CodeSource 1 1 402 10 9 9 9 9 10 9 10 100 10 100 10 7 10 10 10 100 10 10 10 10 10 100 10 10 10 10 10 10 10 10 10 10 10 10 10 8 10 10 10 10 8 10 10 100 10 10 8 10 10 10 8 8 9 100 8 10 10 8 10 8 8 8 10 10 10 10 10 10 100 100 10 10 10 10 10 100 10 10 8 10 10 10 100 10 100 100 8 8 10 10 10 100 10 10 11 10 10 11 10 10 8 100 10 10 100 10 11 11 7 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 1 1 1 1 1 1 1 1 1 12 12 12 12 12 7 12 12 100 12 100 12 1 12 12 100 1 12 100 12 12 12 1 12 100 100 12 100 12 12 12 12 12 12 1 12 12 12 12 1 12 1 12 1 12 12 12 1 1 12 1 1 12 12 1 12 1 1 1 12 12 12 12 12 12 1 1 12 12 12 12 12 1 12 1 12 12 12 1 12 1 1 1 1 12 100 12 1 12 12 12 12 12 100 1 1 12 12 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/lang/StackTraceElement 0 0 224 10 10 9 9 9 9 8 10 100 9 8 9 9 9 8 10 10 100 10 10 8 10 10 8 8 8 10 8 8 10 8 8 100 10 10 10 10 9 10 10 100 10 10 10 10 10 10 10 10 10 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 1 100 12 1 12 1 12 12 12 1 12 12 1 12 1 12 12 1 1 1 12 1 1 12 1 1 1 12 12 12 12 12 12 12 1 12 100 12 100 12 12 12 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass java/nio/IntBuffer +instanceKlass java/nio/CharBuffer +instanceKlass java/nio/LongBuffer +instanceKlass java/nio/ByteBuffer +ciInstanceKlass java/nio/Buffer 1 1 194 100 10 9 9 10 9 10 10 100 100 10 8 10 10 8 8 10 10 8 9 100 8 10 8 8 9 10 8 8 8 10 8 8 8 100 10 100 10 100 10 100 10 7 10 10 9 7 10 10 7 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 1 1 1 12 12 1 1 12 12 1 12 1 1 12 1 1 12 12 1 1 1 12 1 1 1 1 1 1 1 1 7 12 7 12 12 1 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/nio/Buffer UNSAFE Ljdk/internal/misc/Unsafe; jdk/internal/misc/Unsafe +staticfield java/nio/Buffer $assertionsDisabled Z 1 +ciInstanceKlass java/lang/StackWalker 0 0 235 9 10 100 10 10 11 10 10 100 10 100 8 10 10 10 10 9 9 9 9 10 9 10 11 100 8 10 10 9 10 10 10 18 100 8 10 10 10 9 11 10 100 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 100 12 1 100 12 12 100 12 12 12 1 12 1 1 12 12 12 12 12 12 12 12 12 12 100 12 12 1 1 12 12 12 100 12 100 12 1 15 16 15 16 12 1 1 12 100 12 12 100 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 10 1 1 1 1 1 1 1 1 1 1 1 1 100 12 12 1 1 100 1 1 100 1 1 +ciInstanceKlass java/lang/StackStreamFactory$AbstractStackWalker 1 0 306 100 100 3 10 10 10 9 10 9 9 9 9 9 10 10 9 10 10 9 9 100 10 8 10 10 8 10 10 100 8 10 8 10 9 10 9 8 5 0 8 8 9 10 10 10 9 10 10 10 10 10 10 8 10 10 10 10 8 100 10 10 10 10 10 10 9 8 10 10 10 10 10 10 10 10 10 10 8 100 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 100 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 100 12 12 12 12 12 12 12 100 12 100 12 12 12 12 12 12 100 12 1 1 12 12 1 12 100 12 1 1 12 1 12 100 12 12 12 1 1 1 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 1 1 12 12 12 12 12 100 12 12 1 12 12 12 12 12 12 12 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass java/lang/LiveStackFrameInfo +ciInstanceKlass java/lang/StackFrameInfo 0 0 132 10 9 9 9 11 9 11 10 10 10 11 11 11 10 9 10 10 10 11 10 9 10 100 8 10 10 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 12 100 12 12 100 12 12 12 12 100 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 1 12 100 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/lang/LiveStackFrameInfo 0 0 97 10 9 9 9 9 9 100 10 10 8 10 100 8 8 8 10 100 10 100 10 100 100 100 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 1 12 12 1 12 1 1 1 1 1 12 1 12 1 1 1 1 1 1 1 1 1 +instanceKlass java/util/concurrent/locks/AbstractQueuedSynchronizer +ciInstanceKlass java/util/concurrent/locks/AbstractOwnableSynchronizer 1 1 32 10 9 7 7 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 +ciInstanceKlass java/lang/Boolean 1 1 128 10 9 10 10 8 10 9 9 8 10 7 10 10 100 100 10 10 8 10 9 7 100 100 1 1 1 1 1 1 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 1 12 12 12 1 12 1 12 7 12 1 1 12 12 1 7 12 12 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/Boolean TRUE Ljava/lang/Boolean; java/lang/Boolean +staticfield java/lang/Boolean FALSE Ljava/lang/Boolean; java/lang/Boolean +staticfield java/lang/Boolean TYPE Ljava/lang/Class; java/lang/Class +ciInstanceKlass java/lang/Character 1 1 554 7 100 10 9 9 10 10 10 10 10 10 3 3 3 3 3 10 10 3 11 11 10 10 100 10 10 3 10 10 10 100 8 7 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 5 0 10 10 10 10 10 10 10 10 10 10 9 100 10 10 10 3 10 10 10 100 10 10 10 10 8 10 9 10 10 10 10 10 10 10 10 10 100 8 10 10 8 10 9 100 100 7 1 1 100 1 100 1 100 1 1 1 1 3 1 3 1 1 3 1 3 1 1 1 1 1 1 1 3 1 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 3 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 7 12 12 12 12 1 12 12 12 12 1 1 1 100 12 12 12 12 12 12 12 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 100 12 12 12 1 12 12 12 1 12 100 12 12 12 12 12 12 12 1 1 12 7 12 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/Character TYPE Ljava/lang/Class; java/lang/Class +staticfield java/lang/Character $assertionsDisabled Z 1 +instanceKlass java/math/BigInteger +instanceKlass java/util/concurrent/atomic/AtomicLong +instanceKlass java/util/concurrent/atomic/AtomicInteger +instanceKlass java/lang/Long +instanceKlass java/lang/Integer +instanceKlass java/lang/Short +instanceKlass java/lang/Byte +instanceKlass java/lang/Double +instanceKlass java/lang/Float +ciInstanceKlass java/lang/Number 1 1 37 10 10 100 7 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 +ciInstanceKlass java/lang/Float 1 1 192 7 100 10 10 4 100 10 10 8 8 10 10 10 10 4 4 4 10 9 10 10 10 10 10 10 3 10 10 10 10 8 10 9 7 100 1 1 1 1 1 4 1 1 1 4 1 1 3 1 3 1 3 1 3 1 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 100 12 1 12 12 1 1 100 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 7 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/Float TYPE Ljava/lang/Class; java/lang/Class +ciInstanceKlass java/lang/Double 1 1 254 7 100 10 10 10 100 10 10 6 0 8 10 8 10 8 6 0 10 100 5 0 5 0 8 8 10 10 8 10 8 8 8 10 10 10 10 10 10 10 10 6 0 6 0 6 0 10 9 10 10 10 10 5 0 10 10 10 10 8 10 9 7 100 1 1 1 1 1 6 0 1 1 1 6 0 1 1 3 1 3 1 3 1 3 1 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 12 12 1 12 100 12 1 12 1 12 1 12 1 1 1 100 12 12 1 12 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 7 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/Double TYPE Ljava/lang/Class; java/lang/Class +ciInstanceKlass java/lang/Byte 1 1 178 7 10 9 10 100 100 10 8 10 8 10 10 10 10 10 10 10 10 8 8 10 9 10 10 10 10 10 5 0 10 8 10 9 7 100 7 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 3 1 3 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 12 12 1 1 12 1 12 1 12 12 12 12 12 12 12 12 1 1 12 12 12 12 12 12 12 1 7 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/Byte TYPE Ljava/lang/Class; java/lang/Class +ciInstanceKlass java/lang/Short 1 1 186 7 100 10 10 100 100 10 8 10 8 10 10 10 10 10 10 9 10 10 10 8 8 10 9 10 10 10 10 10 3 3 5 0 10 8 10 9 100 100 100 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 3 1 3 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 12 1 1 12 1 12 1 12 12 12 12 12 12 12 12 12 12 1 1 12 12 12 12 12 12 12 1 7 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/Short TYPE Ljava/lang/Class; java/lang/Class +ciInstanceKlass java/lang/Integer 1 1 417 7 100 7 7 10 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 9 9 100 8 10 100 10 8 10 10 8 10 8 10 3 10 3 10 10 10 7 11 100 10 11 10 8 10 8 100 10 10 5 0 8 10 10 10 10 7 9 9 10 10 9 10 10 10 10 100 100 10 10 8 8 10 8 8 8 8 8 8 10 10 10 5 0 3 3 3 3 10 3 10 10 8 10 9 3 3 3 3 3 3 9 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 100 12 12 100 12 12 100 12 12 12 7 12 12 12 12 12 12 12 12 12 1 1 12 1 12 1 12 12 1 12 1 12 12 12 12 7 12 1 1 12 1 12 1 1 12 12 1 12 12 12 12 1 12 12 12 12 12 12 12 7 12 1 1 12 12 1 1 12 1 1 1 1 1 1 12 12 12 12 12 12 1 7 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/Integer TYPE Ljava/lang/Class; java/lang/Class +staticfield java/lang/Integer digits [C 36 +staticfield java/lang/Integer DigitTens [B 100 +staticfield java/lang/Integer DigitOnes [B 100 +staticfield java/lang/Integer sizeTable [I 10 +ciInstanceKlass java/lang/Long 1 1 482 7 100 7 7 10 9 9 10 10 10 10 10 10 10 10 5 0 5 0 100 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 5 0 5 0 9 9 5 0 100 8 10 8 10 8 8 10 5 0 10 5 0 10 10 10 100 11 100 10 11 10 8 10 8 100 10 10 8 8 11 10 10 10 5 0 5 0 9 10 10 8 8 10 8 8 8 8 8 8 10 10 10 10 9 10 10 10 100 100 10 10 10 10 10 10 10 5 0 5 0 5 0 10 5 0 5 0 10 10 10 8 10 9 7 100 7 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 3 1 3 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 100 12 12 100 12 12 12 12 12 1 12 12 12 12 12 12 100 12 12 12 12 12 12 100 12 12 12 12 12 12 12 1 12 12 1 1 12 1 12 1 1 12 12 12 12 100 12 1 1 12 1 12 1 1 12 12 1 1 12 12 12 12 12 12 12 1 1 12 1 1 1 1 1 1 12 12 12 12 12 12 100 12 1 1 12 12 12 12 12 12 12 12 12 12 1 7 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/Long TYPE Ljava/lang/Class; java/lang/Class +instanceKlass kotlin/KotlinNullPointerException +ciInstanceKlass java/lang/NullPointerException 1 1 26 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 +ciInstanceKlass java/lang/ArithmeticException 1 1 26 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 +instanceKlass org/jetbrains/kotlin/com/google/common/collect/ImmutableCollection +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/UnsafeWeakList +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/AbstractObjectCollection +instanceKlass org/jetbrains/kotlin/com/google/common/collect/AbstractMultiset +instanceKlass java/util/AbstractQueue +instanceKlass org/jetbrains/kotlin/it/unimi/dsi/fastutil/objects/AbstractReferenceCollection +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Multimaps$Entries +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ImmutableList +instanceKlass java/util/IdentityHashMap$Values +instanceKlass org/jetbrains/kotlin/com/google/common/collect/AbstractMapBasedMultimap$WrappedCollection +instanceKlass java/util/LinkedHashMap$LinkedValues +instanceKlass java/util/HashMap$Values +instanceKlass java/util/ArrayDeque +instanceKlass java/util/AbstractList +instanceKlass java/util/AbstractSet +instanceKlass java/util/ImmutableCollections$AbstractImmutableCollection +ciInstanceKlass java/util/AbstractCollection 1 1 173 100 10 10 10 11 11 10 7 10 10 10 10 10 7 10 7 3 10 100 8 10 3 100 10 11 11 10 10 10 11 8 7 10 10 8 10 10 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 1 100 12 12 12 7 12 7 12 100 12 1 12 1 1 12 1 12 12 12 7 12 1 1 12 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/util/Objects 1 1 140 10 100 8 10 10 10 10 10 10 10 11 100 10 10 8 10 8 100 11 8 100 10 10 10 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 1 12 12 7 12 12 12 12 12 100 12 1 12 12 1 12 1 1 7 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass java/util/Collections$SingletonMap +instanceKlass kotlin/collections/AbstractMutableMap +instanceKlass org/jetbrains/kotlin/protobuf/SmallSortedMap +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/impl/ZipEntryMap +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/hash/LinkedHashMap +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ConcurrentRefHashMap +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/RefHashMap +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap +instanceKlass java/util/EnumMap +instanceKlass java/util/TreeMap +instanceKlass java/util/IdentityHashMap +instanceKlass java/util/WeakHashMap +instanceKlass sun/util/PreHashedMap +instanceKlass java/util/ImmutableCollections$AbstractImmutableMap +instanceKlass java/util/Collections$EmptyMap +instanceKlass java/util/concurrent/ConcurrentHashMap +instanceKlass java/util/HashMap +ciInstanceKlass java/util/AbstractMap 1 1 192 10 10 11 10 11 11 11 7 11 10 11 100 10 11 11 10 11 9 7 10 9 100 10 7 11 11 11 100 100 11 8 100 10 10 8 10 10 10 7 7 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 100 100 12 12 12 12 12 12 1 12 12 12 1 12 12 12 12 1 12 12 1 1 12 12 1 1 12 1 1 12 1 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass java/lang/ProcessEnvironment +instanceKlass java/util/LinkedHashMap +ciInstanceKlass java/util/HashMap 1 1 573 10 100 10 100 10 100 11 11 11 10 7 3 10 100 100 10 8 10 10 10 10 10 8 10 9 10 9 4 10 10 11 9 4 10 11 11 11 11 7 11 11 10 10 9 10 9 9 9 10 9 7 10 10 10 10 10 9 10 7 3 7 10 10 9 9 10 10 10 10 9 7 10 9 7 10 9 7 10 100 10 11 100 10 11 11 10 100 100 10 10 10 10 10 10 10 100 10 10 8 4 10 4 10 4 10 100 11 10 10 10 10 7 7 100 100 1 1 100 1 100 1 100 1 100 1 100 1 100 1 100 1 100 1 1 1 1 1 1 1 1 5 0 1 1 3 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 12 1 12 1 12 1 12 12 12 12 1 12 1 1 1 12 12 12 12 7 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 1 1 12 12 12 12 12 12 12 12 1 12 12 1 12 1 1 12 1 12 12 12 1 1 12 12 12 12 12 12 12 1 12 1 100 12 12 100 12 1 100 12 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/lang/StringLatin1 1 1 314 7 10 100 10 10 10 10 10 10 10 10 10 10 10 10 10 9 10 10 10 10 10 10 10 100 10 10 10 8 8 8 10 10 10 7 10 10 10 10 10 10 10 10 10 10 10 8 10 100 10 10 10 10 10 7 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 12 12 7 12 12 7 12 12 7 12 12 12 12 12 7 12 12 12 12 12 12 12 12 1 12 12 1 1 1 12 100 12 12 1 12 12 12 12 12 12 12 12 12 12 1 12 1 12 100 12 7 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/StubList$1 +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/StubList +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Lists$AbstractListWrapper +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Lists$Partition +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Lists$TransformingRandomAccessList +instanceKlass java/util/AbstractList$SubList +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$RelativeTokenTypesView +instanceKlass kotlin/collections/AbstractMutableList +instanceKlass org/jetbrains/kotlin/protobuf/UnmodifiableLazyStringList +instanceKlass org/jetbrains/kotlin/protobuf/LazyStringArrayList +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/ContainerUtilRt$EmptyList +instanceKlass org/jetbrains/kotlin/org/jdom/ContentList$FilterList +instanceKlass org/jetbrains/kotlin/org/jdom/AttributeList +instanceKlass org/jetbrains/kotlin/org/jdom/ContentList +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/DisposableWrapperList +instanceKlass org/jetbrains/kotlin/com/intellij/util/SmartList +instanceKlass java/util/AbstractSequentialList +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/UnmodifiableLazyStringList +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/LazyStringArrayList +instanceKlass java/util/ArrayList$SubList +instanceKlass kotlin/reflect/jvm/internal/impl/utils/SmartList +instanceKlass java/util/Collections$SingletonList +instanceKlass org/jetbrains/kotlin/utils/SmartList +instanceKlass java/util/Arrays$ArrayList +instanceKlass java/util/Vector +instanceKlass java/util/ArrayList +instanceKlass java/util/Collections$EmptyList +ciInstanceKlass java/util/AbstractList 1 1 218 10 9 10 10 100 10 10 11 11 11 10 10 11 11 11 10 10 11 11 11 7 10 7 10 10 7 7 10 7 10 100 100 10 8 10 10 10 10 8 100 8 8 8 10 100 11 10 10 11 10 8 8 7 7 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 100 12 1 12 1 12 12 1 1 12 1 1 1 1 12 12 12 12 1 1 1 1 1 1 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/lang/Math 1 1 381 10 10 10 10 10 10 10 7 6 0 6 0 10 10 10 10 10 10 10 10 10 10 10 10 100 3 3 3 10 100 5 0 5 0 5 0 5 0 5 0 9 10 100 8 10 8 10 10 100 5 0 5 0 100 3 5 0 3 5 0 10 10 10 9 9 10 7 6 0 10 9 100 10 10 100 10 10 10 10 10 10 6 0 10 10 10 10 7 4 10 10 10 10 10 10 10 10 10 10 10 5 0 6 0 4 6 0 4 6 0 4 10 9 10 9 10 4 6 0 100 100 1 1 1 1 1 6 0 1 6 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 7 12 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 12 1 12 1 12 100 12 1 1 12 1 12 12 1 1 12 12 12 12 12 12 1 12 12 1 12 1 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/Math negativeZeroFloatBits J -2147483648 +staticfield java/lang/Math negativeZeroDoubleBits J -9223372036854775808 +staticfield java/lang/Math $assertionsDisabled Z 1 +ciInstanceKlass java/util/Arrays 1 1 1057 10 100 100 10 8 10 10 8 8 10 10 100 10 10 10 10 10 10 10 10 10 7 10 100 10 10 100 10 10 100 10 10 100 10 10 100 10 10 100 10 10 100 10 10 9 10 100 10 10 10 100 10 10 7 9 10 10 10 10 10 10 7 11 10 10 10 10 10 10 10 10 11 10 100 10 10 100 10 10 100 10 10 100 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 7 10 10 8 7 10 10 10 10 9 100 10 9 100 10 9 100 10 9 100 10 9 100 10 9 100 10 9 100 10 100 10 10 9 100 10 10 10 10 10 10 10 10 10 10 10 8 8 10 10 8 10 10 10 10 100 3 10 100 10 10 11 10 10 10 10 10 10 10 10 10 11 8 10 11 11 11 11 18 11 11 18 11 18 11 18 100 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 1 1 1 7 1 100 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 1 1 12 12 1 1 12 12 1 12 7 12 12 12 12 12 12 12 12 1 100 12 100 1 1 1 12 12 100 1 1 12 100 1 1 12 100 1 1 12 100 1 1 12 100 1 1 12 100 1 1 12 12 7 12 100 1 1 12 12 7 12 12 12 12 7 12 100 12 12 12 12 1 12 12 7 12 12 12 100 12 12 12 12 7 12 100 1 1 12 1 1 12 1 1 12 1 1 12 12 12 12 12 12 12 100 12 12 100 12 12 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 7 12 12 1 1 12 12 12 12 100 12 12 12 100 12 100 12 100 12 100 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 1 1 12 12 1 12 12 12 100 12 1 1 12 100 12 12 12 12 12 12 12 12 12 12 12 1 12 100 12 100 12 12 1 15 16 15 12 12 100 12 15 12 100 12 15 12 100 12 15 12 1 7 12 12 12 12 12 12 12 12 12 12 7 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 10 1 1 1 1 1 1 1 10 1 1 1 1 10 1 1 1 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 12 12 12 12 1 1 100 1 1 100 1 1 +staticfield java/util/Arrays $assertionsDisabled Z 1 +ciInstanceKlass java/lang/StringUTF16 1 1 532 100 7 10 100 10 7 3 100 100 10 8 10 10 8 10 10 9 10 100 8 10 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 10 10 10 10 10 10 10 10 10 10 10 10 100 3 10 10 10 10 10 10 10 9 10 10 10 10 100 10 10 10 10 10 8 8 8 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 8 10 100 10 10 10 10 11 10 10 10 9 9 5 0 5 0 10 10 10 10 10 100 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 1 1 1 1 12 12 1 12 12 12 12 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 12 12 12 7 12 7 12 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 12 1 12 12 100 12 12 1 1 1 12 12 12 12 100 12 12 12 12 12 12 12 12 100 12 12 12 12 1 12 1 12 100 12 12 12 100 12 12 12 12 12 12 12 12 12 7 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/lang/StringUTF16 HI_BYTE_SHIFT I 0 +staticfield java/lang/StringUTF16 LO_BYTE_SHIFT I 8 +staticfield java/lang/StringUTF16 $assertionsDisabled Z 1 +instanceKlass java/util/LinkedHashMap$Entry +ciInstanceKlass java/util/HashMap$Node 1 1 95 10 9 9 9 9 100 10 10 8 10 10 10 100 11 10 11 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 12 12 12 12 1 12 1 12 12 100 12 100 1 12 12 12 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass org/jetbrains/kotlin/container/UnresolvedServiceException +instanceKlass org/jetbrains/kotlin/org/jdom/IllegalDataException +instanceKlass org/jetbrains/kotlin/org/jdom/IllegalAddException +instanceKlass java/nio/charset/UnsupportedCharsetException +instanceKlass java/nio/charset/IllegalCharsetNameException +instanceKlass java/util/regex/PatternSyntaxException +instanceKlass org/jetbrains/kotlin/org/jdom/IllegalNameException +instanceKlass java/nio/file/InvalidPathException +instanceKlass java/nio/file/ProviderMismatchException +instanceKlass java/lang/NumberFormatException +ciInstanceKlass java/lang/IllegalArgumentException 1 1 35 10 10 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 1 1 +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/NotNullList +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/MarkerPool +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/Stack +instanceKlass org/jetbrains/kotlin/config/MavenComparableVersion$ListItem +ciInstanceKlass java/util/ArrayList 1 1 500 100 10 7 9 9 100 100 10 8 10 10 10 10 9 11 9 10 7 7 10 9 10 10 10 10 100 10 3 10 3 10 10 10 10 10 100 100 10 10 10 10 10 10 10 10 7 10 10 10 100 10 11 11 11 10 10 10 100 10 10 10 10 8 8 8 8 10 10 11 100 10 10 10 10 10 10 11 10 100 8 10 7 10 7 10 10 7 10 10 11 7 10 10 11 10 10 10 10 11 10 7 100 100 100 1 1 1 1 1 1 1 1 5 0 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 7 1 12 1 12 12 1 1 1 12 12 12 12 12 12 12 12 1 7 12 12 12 12 12 7 12 1 12 12 12 12 12 12 1 1 12 7 12 7 12 12 12 12 12 12 1 12 12 12 1 12 12 12 12 12 12 1 12 12 12 1 1 1 1 12 12 12 1 100 12 12 12 100 12 12 100 12 100 12 12 1 1 1 12 1 12 12 1 12 12 12 1 12 12 100 12 12 12 12 12 100 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/util/ArrayList EMPTY_ELEMENTDATA [Ljava/lang/Object; 0 [Ljava/lang/Object; +staticfield java/util/ArrayList DEFAULTCAPACITY_EMPTY_ELEMENTDATA [Ljava/lang/Object; 0 [Ljava/lang/Object; +instanceKlass org/jetbrains/kotlin/types/AbstractTypeCheckerContext$LowerCapturedTypePolicy +instanceKlass org/jetbrains/kotlin/resolve/jvm/jvmSignature/JvmMethodParameterKind +instanceKlass org/jetbrains/kotlin/resolve/calls/model/ArgumentMatchStatus +instanceKlass org/jetbrains/kotlin/builtins/UnsignedArrayType +instanceKlass org/jetbrains/kotlin/builtins/UnsignedType +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper$CallArgumentProcessor$State +instanceKlass org/jetbrains/kotlin/resolve/calls/components/ImplicitInvokeCheckStatus +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/StubList$ChildrenStorage +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/projectRoots/JavaSdkVersion +instanceKlass org/jetbrains/kotlin/com/intellij/psi/scope/ElementClassHint$DeclarationKind +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/PsiClassImplUtil$MemberType +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/TreeTraversal$BiOrderIt$Order +instanceKlass org/jetbrains/kotlin/com/intellij/util/containers/JBIterator$Do +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/Nullability +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValue$Kind +instanceKlass org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResults$Code +instanceKlass org/jetbrains/kotlin/types/TypeApproximatorConfiguration$IntersectionStrategy +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder$TypeVariableFixationReadiness +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/ConstraintKind +instanceKlass org/jetbrains/kotlin/resolve/calls/tower/CandidateApplicability +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl$State +instanceKlass org/jetbrains/kotlin/resolve/calls/model/KotlinCallKind +instanceKlass org/jetbrains/kotlin/types/expressions/ControlStructureTypingUtils$ResolveConstruct +instanceKlass org/jetbrains/kotlin/resolve/calls/tasks/ExplicitReceiverKind +instanceKlass org/jetbrains/kotlin/psi/Call$CallType +instanceKlass org/jetbrains/kotlin/codegen/OwnerKind +instanceKlass org/jetbrains/kotlin/resolve/ExternalOverridabilityCondition$Result +instanceKlass org/jetbrains/kotlin/resolve/ExternalOverridabilityCondition$Contract +instanceKlass org/jetbrains/kotlin/resolve/OverridingUtil$OverrideCompatibilityInfo$Result +instanceKlass org/jetbrains/kotlin/load/java/SpecialGenericSignatures$TypeSafeBarrierDescription +instanceKlass org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor$ParameterNamesStatus +instanceKlass org/jetbrains/kotlin/resolve/ModifierCheckerCore$Compatibility +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/ExpressionParser$ExprType +instanceKlass org/jetbrains/kotlin/types/TypeSubstitutor$VarianceConflictType +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/TypeComponentPosition +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/NullabilityQualifier +instanceKlass org/jetbrains/kotlin/load/java/typeEnhancement/MutabilityQualifier +instanceKlass org/jetbrains/kotlin/name/State +instanceKlass org/jetbrains/kotlin/load/java/AnnotationQualifierApplicabilityType +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor$CoroutinesCompatibilityMode +instanceKlass org/jetbrains/kotlin/resolve/lazy/LazyImportScope$FilteringKind +instanceKlass org/jetbrains/kotlin/resolve/scopes/LexicalScopeKind +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Effect$InvocationKind +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Expression$ConstantValue +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Effect$EffectType +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$VersionRequirement$VersionKind +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$VersionRequirement$Level +instanceKlass org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedContainerAbiStability +instanceKlass org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf$StringTableTypes$Record$Operation +instanceKlass org/jetbrains/kotlin/load/java/lazy/types/JavaTypeFlexibility +instanceKlass org/jetbrains/kotlin/load/java/components/TypeUsage +instanceKlass org/jetbrains/kotlin/com/google/common/collect/Iterators$EmptyModifiableIterator +instanceKlass org/jetbrains/kotlin/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl$Kind +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/DeclarationParser$ListType +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/DeclarationParser$Context +instanceKlass org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryClassSignatureParser$JavaSignatureVariance +instanceKlass org/jetbrains/kotlin/resolve/jvm/JvmPrimitiveType +instanceKlass javaslang/collection/HashArrayMappedTrieModule$Action +instanceKlass org/jetbrains/kotlin/load/java/structure/LightClassOriginKind +instanceKlass org/jetbrains/kotlin/parsing/KotlinParsing$ParseEnumEntryResult +instanceKlass org/jetbrains/kotlin/parsing/KotlinParsing$DeclarationParsingMode +instanceKlass org/jetbrains/kotlin/parsing/KotlinParsing$NameParsingMode +instanceKlass org/jetbrains/kotlin/parsing/KotlinParsing$AnnotationParsingMode +instanceKlass org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +instanceKlass org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader$Kind +instanceKlass org/jetbrains/kotlin/builtins/functions/FunctionClassKind +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$MemberKind +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Class$Kind +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Modality +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Visibility +instanceKlass org/jetbrains/kotlin/incremental/components/NoLookupLocation +instanceKlass org/jetbrains/kotlin/descriptors/annotations/KotlinTarget +instanceKlass org/jetbrains/kotlin/serialization/deserialization/AnnotatedCallableKind +instanceKlass org/jetbrains/kotlin/resolve/lazy/FileScopeFactory$FilteringKind +instanceKlass org/jetbrains/kotlin/types/expressions/FakeCallKind +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/TypeVariableDirectionCalculator$ResolveDirection +instanceKlass org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemCompletionMode +instanceKlass org/jetbrains/kotlin/resolve/calls/results/ResolutionStatus +instanceKlass org/jetbrains/kotlin/resolve/calls/context/CheckArgumentTypesMode +instanceKlass org/jetbrains/kotlin/resolve/calls/smartcasts/SmartCastManager$ReceiverSmartCastResult +instanceKlass org/jetbrains/kotlin/resolve/calls/callResolverUtil/ResolveArgumentsMode +instanceKlass org/jetbrains/kotlin/types/expressions/CoercionStrategy +instanceKlass org/jetbrains/kotlin/resolve/calls/context/ContextDependency +instanceKlass org/jetbrains/kotlin/resolve/QualifierPosition +instanceKlass org/jetbrains/kotlin/psi/KtProjectionKind +instanceKlass org/jetbrains/kotlin/resolve/TopDownAnalysisMode +instanceKlass org/jetbrains/kotlin/incremental/components/ScopeKind +instanceKlass org/jetbrains/kotlin/types/model/CaptureStatus +instanceKlass org/jetbrains/kotlin/types/model/TypeVariance +instanceKlass org/jetbrains/kotlin/analyzer/ModuleInfo$DependencyOnBuiltIns +instanceKlass org/jetbrains/kotlin/types/Variance +instanceKlass org/jetbrains/kotlin/com/intellij/diagnostic/ActivityCategory +instanceKlass org/jetbrains/kotlin/container/ComponentState +instanceKlass org/jetbrains/kotlin/container/ComponentStorageState +instanceKlass org/jetbrains/kotlin/descriptors/annotations/AnnotationUseSiteTarget +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Type$Argument$Projection +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$QualifiedNameTable$QualifiedName$Kind +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$TypeParameter$Variance +instanceKlass org/jetbrains/kotlin/metadata/ProtoBuf$Annotation$Argument$Value$Type +instanceKlass org/jetbrains/kotlin/protobuf/WireFormat$JavaType +instanceKlass org/jetbrains/kotlin/protobuf/WireFormat$FieldType +instanceKlass org/jetbrains/kotlin/descriptors/CallableMemberDescriptor$Kind +instanceKlass org/jetbrains/kotlin/descriptors/ClassKind +instanceKlass org/jetbrains/kotlin/descriptors/Modality +instanceKlass org/jetbrains/kotlin/builtins/PrimitiveType +instanceKlass org/jetbrains/kotlin/storage/LockBasedStorageManager$NotValue +instanceKlass org/jetbrains/kotlin/builtins/jvm/JvmBuiltIns$Kind +instanceKlass org/jetbrains/kotlin/diagnostics/Severity +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/fileEditor/impl/LoadTextUtil$AutoDetectionReason +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/CharsetToolkit$GuessedEncoding +instanceKlass org/jetbrains/kotlin/cli/jvm/index/JavaRoot$RootType +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/io/FileAttributes$Type +instanceKlass java/nio/file/attribute/PosixFilePermission +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/vfs/VFileProperty +instanceKlass kotlin/collections/State +instanceKlass kotlin/io/FileWalkDirection +instanceKlass org/jetbrains/kotlin/parcelize/ParcelizeSyntheticComponent$ComponentKind +instanceKlass org/jetbrains/kotlin/com/intellij/util/ThreeState +instanceKlass org/jetbrains/kotlin/com/intellij/pom/java/LanguageLevel +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/LowMemoryWatcher$LowMemoryWatcherType +instanceKlass org/jetbrains/kotlin/org/jdom/AttributeType +instanceKlass org/jetbrains/kotlin/org/jdom/Content$CType +instanceKlass com/sun/org/apache/xerces/internal/impl/XMLScanner$NameType +instanceKlass javax/xml/catalog/CatalogFeatures$Feature +instanceKlass com/sun/org/apache/xerces/internal/utils/XMLSecurityPropertyManager$Property +instanceKlass com/sun/org/apache/xerces/internal/utils/XMLSecurityPropertyManager$State +instanceKlass com/sun/org/apache/xerces/internal/utils/XMLSecurityManager$NameMap +instanceKlass com/sun/org/apache/xerces/internal/utils/XMLSecurityManager$State +instanceKlass com/sun/org/apache/xerces/internal/utils/XMLSecurityManager$Limit +instanceKlass java/time/zone/ZoneOffsetTransitionRule$TimeDefinition +instanceKlass java/time/DayOfWeek +instanceKlass java/time/Month +instanceKlass java/time/temporal/ChronoUnit +instanceKlass java/time/temporal/ChronoField +instanceKlass java/nio/file/AccessMode +instanceKlass java/math/RoundingMode +instanceKlass sun/util/locale/provider/LocaleProviderAdapter$Type +instanceKlass org/jetbrains/kotlin/com/intellij/diagnostic/LoadingState +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/progress/impl/CoreProgressManager$CheckCanceledBehavior +instanceKlass org/jetbrains/kotlin/com/intellij/util/messages/Topic$BroadcastDirection +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/extensions/ExtensionPoint$Kind +instanceKlass org/jetbrains/kotlin/cli/jvm/compiler/EnvironmentConfigFiles +instanceKlass org/jetbrains/kotlin/config/JVMConstructorCallNormalizationMode +instanceKlass org/jetbrains/kotlin/config/JvmAbiStability +instanceKlass org/jetbrains/kotlin/config/LanguageFeature$Kind +instanceKlass org/jetbrains/kotlin/base/kapt3/DetectMemoryLeaksMode +instanceKlass org/jetbrains/kotlin/base/kapt3/AptMode +instanceKlass org/jetbrains/kotlin/base/kapt3/KaptFlag +instanceKlass org/jetbrains/kotlin/kapt/cli/CliToolOption$Format +instanceKlass org/jetbrains/kotlin/kapt/cli/KaptCliOption +instanceKlass java/util/stream/MatchOps$MatchKind +instanceKlass java/util/regex/Pattern$Qtype +instanceKlass org/jetbrains/kotlin/utils/ReportLevel +instanceKlass org/jetbrains/kotlin/config/ConstraintSystemForOverloadResolutionMode +instanceKlass jdk/internal/logger/BootstrapLogger$LoggingBackend +instanceKlass java/util/stream/StreamShape +instanceKlass java/lang/invoke/StringConcatFactory$Mode +instanceKlass java/lang/invoke/StringConcatFactory$Strategy +instanceKlass kotlin/annotation/AnnotationRetention +instanceKlass kotlin/DeprecationLevel +instanceKlass java/lang/annotation/ElementType +instanceKlass kotlin/annotation/AnnotationTarget +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$PropertyRelatedElement +instanceKlass org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments$VersionKind +instanceKlass org/jetbrains/kotlin/config/LanguageVersion +instanceKlass org/jetbrains/kotlin/config/LanguageFeature$State +instanceKlass org/jetbrains/kotlin/config/LanguageFeature +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/SpecialGenericSignatures$TypeSafeBarrierDescription +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/ExternalOverridabilityCondition$Contract +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/ExternalOverridabilityCondition$Result +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$OverrideCompatibilityInfo$Result +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedMemberDescriptor$CoroutinesCompatibilityMode +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotatedCallableKind +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/lazy/types/JavaTypeFlexibility +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/components/TypeUsage +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$QualifiedNameTable$QualifiedName$Kind +instanceKlass kotlin/reflect/jvm/internal/impl/load/java/structure/LightClassOriginKind +instanceKlass kotlin/reflect/jvm/internal/KDeclarationContainerImpl$MemberBelonginess +instanceKlass kotlin/reflect/jvm/internal/impl/types/Variance +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$MemberKind +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$Kind +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Modality +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Visibility +instanceKlass kotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedContainerAbiStability +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$Argument$Projection +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$StringTableTypes$Record$Operation +instanceKlass java/lang/annotation/RetentionPolicy +instanceKlass kotlin/reflect/jvm/internal/impl/incremental/components/NoLookupLocation +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$Type +instanceKlass kotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter$Variance +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType +instanceKlass kotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/ClassKind +instanceKlass java/util/stream/StreamOpFlag$Type +instanceKlass java/util/stream/StreamOpFlag +instanceKlass kotlin/reflect/jvm/internal/impl/descriptors/Modality +instanceKlass kotlin/reflect/jvm/internal/impl/utils/ReportLevel +instanceKlass kotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind +instanceKlass kotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$NotValue +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind +instanceKlass kotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/PrimitiveType +instanceKlass kotlin/reflect/jvm/internal/impl/builtins/functions/FunctionClassKind +instanceKlass org/jetbrains/kotlin/config/JvmStringConcat +instanceKlass org/jetbrains/kotlin/config/JvmDefaultMode +instanceKlass org/jetbrains/kotlin/config/JVMAssertionsMode +instanceKlass org/jetbrains/kotlin/config/JvmTarget +instanceKlass org/jetbrains/kotlin/config/ExplicitApiMode +instanceKlass kotlin/LazyThreadSafetyMode +instanceKlass java/lang/invoke/MethodHandleImpl$Intrinsic +instanceKlass java/lang/invoke/LambdaForm$BasicType +instanceKlass java/lang/invoke/LambdaForm$Kind +instanceKlass org/jetbrains/kotlin/cli/common/messages/CompilerMessageSeverity +instanceKlass org/jetbrains/kotlin/cli/common/CompilerSystemProperties +instanceKlass org/jetbrains/kotlin/cli/common/ExitCode +instanceKlass sun/invoke/util/Wrapper +instanceKlass java/lang/invoke/VarHandle$AccessMode +instanceKlass java/lang/invoke/VarHandle$AccessType +instanceKlass java/util/concurrent/TimeUnit +instanceKlass java/nio/file/LinkOption +instanceKlass sun/nio/fs/WindowsPathType +instanceKlass java/nio/file/StandardOpenOption +instanceKlass jdk/internal/module/IllegalAccessLogger$Mode +instanceKlass java/io/File$PathStatus +instanceKlass java/lang/module/ModuleDescriptor$Requires$Modifier +instanceKlass java/lang/module/ModuleDescriptor$Modifier +ciInstanceKlass java/lang/Enum 1 1 140 9 9 10 10 100 10 10 10 100 10 10 7 10 11 100 8 10 100 100 10 8 10 10 8 10 10 100 8 10 10 7 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 100 1 1 1 1 12 12 12 12 1 12 12 1 12 1 12 7 12 1 1 12 1 1 1 12 12 1 12 1 1 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/util/HashMap$TreeNode 0 0 250 100 10 9 9 100 9 9 9 10 100 10 9 9 9 10 10 10 10 10 10 10 10 10 9 10 10 10 10 9 10 10 10 10 10 10 10 100 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 1 12 12 12 12 1 12 12 12 12 12 12 12 12 12 12 12 100 12 100 12 12 12 12 12 12 12 12 12 12 12 12 12 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass jdk/internal/util/Preconditions 1 1 147 10 11 11 100 100 10 10 8 100 10 10 8 8 7 10 8 100 10 8 10 10 11 8 8 11 8 8 8 10 10 10 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 100 12 1 1 12 12 1 12 12 1 12 1 1 12 1 12 12 12 1 1 12 1 1 1 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/util/zip/ZipFile$Source$Key 1 1 68 10 9 9 11 10 10 7 10 11 10 10 7 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 12 12 7 12 7 12 7 12 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/util/function/BiFunction 1 1 65 10 18 11 11 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 12 1 15 16 15 12 12 100 12 1 1 1 1 1 10 11 1 1 100 12 12 1 1 100 1 1 1 100 1 1 +ciInstanceKlass java/lang/Void 1 1 31 10 8 10 9 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 7 12 12 1 1 1 1 1 +staticfield java/lang/Void TYPE Ljava/lang/Class; java/lang/Class +ciInstanceKlass java/lang/AssertionError 0 0 79 10 10 10 10 100 10 10 10 10 10 10 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 100 12 1 12 12 12 12 12 12 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass java/lang/ArrayIndexOutOfBoundsException +ciInstanceKlass java/lang/IndexOutOfBoundsException 0 0 45 10 10 100 10 8 10 10 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 12 12 12 1 1 1 1 1 1 1 +instanceKlass java/nio/HeapCharBuffer +ciInstanceKlass java/nio/CharBuffer 1 1 335 10 9 9 10 10 7 10 10 100 100 10 10 10 10 10 10 10 10 100 10 11 10 10 100 10 10 10 10 10 100 10 100 10 10 10 10 10 10 9 100 10 10 10 10 10 10 10 10 10 7 10 10 10 10 10 8 10 11 11 18 7 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 100 10 100 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 12 12 12 12 12 1 12 12 1 1 12 12 12 100 12 12 12 12 12 1 12 12 12 12 1 12 12 12 12 1 1 12 12 100 12 12 12 1 12 12 12 12 12 12 12 12 1 100 12 12 100 12 12 1 12 12 12 1 15 16 15 16 12 1 100 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 1 12 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 10 1 1 1 1 1 1 100 12 12 1 1 100 1 1 100 1 1 +ciInstanceKlass java/lang/reflect/ProxyGenerator$ConstantPool$IndirectEntry 1 1 63 7 10 9 9 9 10 10 7 7 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 7 12 12 1 1 1 1 1 1 1 1 1 1 +instanceKlass org/jetbrains/kotlin/com/intellij/openapi/diagnostic/DefaultLogger +ciInstanceKlass org/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger 1 1 333 1 7 1 7 1 1 100 1 7 1 1 7 1 1 100 1 100 1 1 1 1 1 1 1 1 12 10 1 1 1 1 1 1 1 100 1 1 12 10 1 1 12 10 12 9 1 7 1 1 12 10 1 100 1 1 12 9 1 7 10 1 8 1 1 12 10 1 100 10 1 100 1 1 12 10 1 1 12 10 1 100 1 1 12 10 1 1 12 10 1 100 1 1 12 10 1 1 12 10 1 12 10 1 100 1 12 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 11 1 1 1 1 1 8 1 12 10 1 1 1 1 1 1 1 1 12 10 1 100 1 12 10 12 10 1 1 1 1 1 1 1 1 12 10 1 1 1 1 12 10 12 10 1 12 10 1 12 10 1 100 1 1 12 9 1 12 10 1 1 100 1 1 12 10 12 10 1 1 12 10 1 1 12 9 1 100 1 1 12 10 16 1 100 1 12 11 15 1 16 1 7 1 1 12 10 15 1 1 12 18 1 100 1 1 12 10 100 1 1 1 1 1 1 1 8 1 8 12 10 1 1 1 1 12 10 1 1 1 1 1 100 1 8 1 1 12 10 1 12 10 1 8 12 10 1 1 100 1 12 10 1 8 1 12 10 1 1 1 1 12 10 12 10 15 1 12 18 1 8 1 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 1 1 12 10 1 100 10 1 100 10 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger ATTACHMENT_TO_STRING Ljava/util/function/Function; org/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger$$Lambda$13 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/util/text/CharSequenceBackedByArray 1 0 32 1 100 1 100 1 100 1 1 1 1 1 1 1 1 100 1 8 1 1 12 10 1 1 1 8 1 1 1 8 1 1 +instanceKlass org/jetbrains/kotlin/kdoc/parser/KDocElementType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/java/IJavaElementType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/java/IJavaDocElementType +instanceKlass org/jetbrains/kotlin/com/intellij/lang/TokenWrapper +instanceKlass org/jetbrains/kotlin/KtNodeType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/IElementType$TombstoneElementType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/TokenType$1 +instanceKlass org/jetbrains/kotlin/lexer/KtToken +instanceKlass org/jetbrains/kotlin/com/intellij/psi/stubs/IStubElementType +instanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/ILazyParseableElementType +ciInstanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/IElementType 1 1 415 1 7 1 7 1 1 7 1 1 100 1 1 100 1 100 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 12 9 12 9 1 7 1 1 12 10 1 7 1 1 12 10 1 7 1 12 11 12 9 7 1 100 1 1 1 1 1 1 12 10 1 100 1 1 12 10 1 100 1 1 12 10 1 8 1 1 12 10 12 9 1 1 12 10 1 12 10 1 1 1 1 1 1 1 1 7 1 12 9 1 100 1 8 10 1 1 12 10 1 1 12 10 1 1 1 1 12 10 1 7 1 7 1 1 12 9 1 12 10 1 1 10 12 9 12 9 1 100 1 1 12 11 16 1 100 1 12 10 15 1 16 1 7 1 1 12 10 15 1 1 12 18 1 1 12 11 1 16 1 1 12 10 15 16 1 1 12 18 1 100 1 1 12 10 1 1 12 11 1 1 12 11 1 100 1 1 12 11 1 16 1 1 12 10 15 16 1 1 12 18 1 100 1 1 12 11 1 1 12 11 1 100 1 1 12 10 1 12 11 12 9 1 8 1 12 10 1 8 1 12 11 1 12 10 1 8 1 8 1 100 1 1 12 10 1 1 12 10 1 7 1 12 10 12 9 1 7 1 1 12 10 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 1 1 1 1 8 1 1 1 1 100 10 1 12 11 1 12 11 1 1 12 11 1 1 1 1 1 1 1 12 9 1 1 1 1 12 10 1 16 12 10 15 16 1 1 12 18 12 10 15 1 12 18 12 9 1 7 1 8 10 1 8 12 10 1 1 8 1 8 1 100 8 8 8 8 8 8 8 8 8 8 8 1 1 12 10 1 100 10 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/com/intellij/psi/tree/IElementType LOG Lorg/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger; org/jetbrains/kotlin/com/intellij/openapi/diagnostic/DefaultLogger +staticfield org/jetbrains/kotlin/com/intellij/psi/tree/IElementType EMPTY_ARRAY [Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 0 [Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; +staticfield org/jetbrains/kotlin/com/intellij/psi/tree/IElementType ARRAY_FACTORY Lorg/jetbrains/kotlin/com/intellij/util/ArrayFactory; org/jetbrains/kotlin/com/intellij/psi/tree/IElementType$$Lambda$58 +staticfield org/jetbrains/kotlin/com/intellij/psi/tree/IElementType TRUE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType$Predicate; org/jetbrains/kotlin/com/intellij/psi/tree/IElementType$$Lambda$59 +staticfield org/jetbrains/kotlin/com/intellij/psi/tree/IElementType lock Ljava/lang/Object; "registry lock"ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/SyntaxTreeBuilder 1 0 49 1 100 1 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/PsiBuilder 1 0 32 1 100 1 100 1 100 1 100 1 100 1 1 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/IElementType$Predicate 1 0 18 1 100 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet 1 1 313 1 7 1 7 1 1 100 1 1 100 1 7 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 12 9 12 9 1 7 1 12 9 100 12 9 12 9 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 12 10 1 12 11 1 1 1 1 1 1 16 12 10 15 1 100 1 1 12 10 15 1 12 18 1 1 12 10 1 1 12 10 7 12 9 1 12 9 1 7 10 1 7 1 12 10 1 1 12 10 1 7 1 1 12 11 1 1 12 11 1 1 1 1 1 1 1 12 10 1 100 1 12 10 1 1 12 9 1 7 12 9 12 9 1 12 10 12 9 1 100 1 100 10 1 8 1 1 12 10 1 100 1 1 12 10 12 10 1 12 10 12 10 1 1 1 1 1 1 1 1 100 1 7 1 1 12 10 1 1 12 11 1 12 11 1 12 11 1 12 10 1 1 1 1 1 1 1 1 1 1 12 10 15 1 12 18 12 10 1 1 1 1 1 1 1 12 10 15 18 5 0 1 1 1 100 1 1 12 10 1 1 7 1 12 10 1 12 9 12 10 12 9 1 8 1 8 1 100 1 100 8 8 8 8 8 8 8 8 8 8 8 8 8 1 1 12 10 1 100 1 12 10 1 100 10 1 100 1 1 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet EMPTY Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet ANY Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet WHITE_SPACE Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet $assertionsDisabled Z 1 +instanceKlass org/jetbrains/kotlin/kdoc/lexer/KDocToken +instanceKlass org/jetbrains/kotlin/lexer/KtSingleValueToken +ciInstanceKlass org/jetbrains/kotlin/lexer/KtToken 1 1 50 1 100 1 7 1 1 1 1 1 1 1 12 10 1 7 1 1 12 9 1 12 10 1 1 1 1 1 8 1 100 8 8 8 1 100 1 1 12 10 1 100 12 10 1 1 1 1 1 1 +instanceKlass org/jetbrains/kotlin/lexer/KtKeywordToken +ciInstanceKlass org/jetbrains/kotlin/lexer/KtSingleValueToken 1 1 61 1 7 1 7 1 1 1 1 1 1 1 1 1 12 10 1 12 10 12 9 1 1 1 1 1 1 1 100 1 8 1 8 1 100 1 100 8 8 8 8 8 1 1 12 10 1 100 10 1 100 10 1 100 1 1 1 1 1 1 1 +instanceKlass org/jetbrains/kotlin/lexer/KtModifierKeywordToken +ciInstanceKlass org/jetbrains/kotlin/lexer/KtKeywordToken 1 1 63 1 7 1 7 1 1 1 1 1 1 12 10 1 1 1 1 12 10 1 1 1 1 1 1 12 10 1 12 10 12 9 1 1 1 1 1 8 1 100 1 100 1 100 8 8 8 8 1 1 12 10 1 100 1 12 10 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/lexer/KtModifierKeywordToken 1 1 54 1 7 1 7 1 1 1 1 1 12 10 1 1 1 1 1 1 1 12 10 10 1 1 1 1 1 1 8 1 100 1 100 1 100 8 8 8 8 1 1 12 10 1 100 1 12 10 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/psi/TokenType 1 1 55 1 7 1 100 1 1 7 1 1 1 1 1 1 1 1 1 1 7 8 1 7 1 1 12 9 1 1 12 10 12 9 8 12 9 8 12 9 8 10 12 9 1 7 8 10 12 9 8 12 9 1 1 1 1 +staticfield org/jetbrains/kotlin/com/intellij/psi/TokenType WHITE_SPACE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/com/intellij/psi/tree/IElementType +staticfield org/jetbrains/kotlin/com/intellij/psi/TokenType BAD_CHARACTER Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/com/intellij/psi/tree/IElementType +staticfield org/jetbrains/kotlin/com/intellij/psi/TokenType NEW_LINE_INDENT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/com/intellij/psi/tree/IElementType +staticfield org/jetbrains/kotlin/com/intellij/psi/TokenType ERROR_ELEMENT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/com/intellij/psi/TokenType$1 +staticfield org/jetbrains/kotlin/com/intellij/psi/TokenType CODE_FRAGMENT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/com/intellij/psi/tree/IFileElementType +staticfield org/jetbrains/kotlin/com/intellij/psi/TokenType DUMMY_HOLDER Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/com/intellij/psi/tree/IFileElementType +ciInstanceKlass org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil 1 1 248 1 7 1 100 1 1 1 1 1 1 12 10 1 7 1 1 12 11 1 12 10 1 1 1 1 1 1 1 12 10 1 1 7 1 12 11 1 7 10 1 7 1 12 10 1 12 10 1 1 12 10 1 7 1 1 12 11 1 12 11 1 100 10 1 100 10 100 1 1 12 11 1 1 1 1 1 1 1 1 1 1 12 11 1 1 12 10 1 12 10 1 12 10 1 12 10 1 1 12 10 1 100 1 1 12 10 1 12 10 1 1 1 1 1 1 1 12 10 1 1 1 1 7 1 1 12 10 10 10 1 1 1 1 1 1 12 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 1 1 1 7 1 1 12 10 1 1 8 1 8 1 100 8 8 8 8 8 8 8 8 8 1 8 1 8 1 8 1 8 1 8 8 8 1 8 8 8 8 1 8 1 8 8 1 8 8 8 1 8 8 1 8 8 1 8 1 8 1 1 12 10 1 100 1 1 12 10 1 100 10 1 100 1 1 1 1 1 1 1 1 +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableText +ciInstanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableCharSequence 1 1 90 1 7 1 7 1 7 1 1 1 12 10 1 1 1 1 1 1 3 1 1 1 12 10 1 1 12 10 1 1 12 11 1 1 1 7 1 1 12 10 1 1 1 1 1 1 8 8 8 1 100 1 100 8 8 1 1 12 10 1 100 1 12 10 1 1 1 1 1 1 1 1 1 100 1 8 1 1 12 10 1 1 1 8 1 1 1 8 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/util/text/CharArrayExternalizable 1 0 31 1 100 1 100 1 100 1 1 1 1 1 1 1 100 1 8 1 1 12 10 1 1 1 8 1 1 1 8 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableText 1 1 318 1 7 1 7 1 100 1 100 1 1 100 1 100 1 1 7 1 1 100 1 1 7 1 1 7 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 12 9 1 1 1 1 1 1 1 12 10 1 7 1 1 12 11 12 9 1 12 10 1 100 1 100 1 12 10 1 1 1 1 12 10 12 10 1 1 1 7 1 1 12 10 1 12 10 1 100 1 1 12 10 1 12 10 1 1 1 1 1 1 10 1 1 12 10 1 1 12 10 1 12 10 1 1 10 1 1 12 10 1 1 12 10 1 1 1 1 12 10 1 1 1 12 10 12 10 1 1 1 1 100 10 1 1 1 1 7 1 12 10 1 1 1 1 12 10 1 12 9 1 100 1 1 12 10 1 1 1 12 9 12 9 12 9 1 1 12 10 1 12 9 12 10 1 1 1 12 10 1 12 10 1 12 9 1 12 9 1 1 1 1 1 100 10 1 8 1 1 12 10 1 12 10 1 1 12 10 1 12 10 10 1 12 10 1 1 10 1 100 1 12 10 1 1 12 10 1 1 12 10 1 12 10 1 1 1 1 1 12 10 1 12 10 1 1 1 1 1 1 7 1 12 9 12 9 1 8 1 8 1 100 8 8 8 1 8 8 8 8 8 8 8 8 8 8 8 8 8 8 1 1 12 10 1 100 10 1 100 10 1 100 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/com/intellij/util/text/ImmutableText EMPTY_NODE Lorg/jetbrains/kotlin/com/intellij/util/text/ImmutableText$LeafNode; org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode +staticfield org/jetbrains/kotlin/com/intellij/util/text/ImmutableText EMPTY Lorg/jetbrains/kotlin/com/intellij/util/text/ImmutableText; org/jetbrains/kotlin/com/intellij/util/text/ImmutableText +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$CompositeNode +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$LeafNode +ciInstanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Node 1 1 87 1 7 1 7 1 100 1 1 100 1 1 1 12 10 1 1 1 1 1 1 1 1 1 1 1 12 10 12 10 1 7 1 1 12 10 1 1 12 10 1 100 1 1 1 1 1 1 12 10 1 1 1 8 8 8 1 1 12 10 1 100 1 12 10 1 1 1 1 1 1 1 1 1 100 1 8 1 1 12 10 1 1 1 8 1 1 +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$WideLeafNode +instanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode +ciInstanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$LeafNode 1 1 41 1 7 1 7 1 1 100 1 1 100 1 1 1 12 10 1 1 1 10 1 1 1 1 1 1 1 1 100 1 8 1 1 12 10 1 1 1 8 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode 1 1 102 1 7 1 7 1 1 100 1 1 1 100 1 1 100 1 1 1 1 1 1 1 12 10 1 12 10 12 9 1 1 1 1 1 1 12 10 1 100 1 12 10 1 100 1 1 12 10 1 1 1 1 1 1 1 1 1 100 1 1 12 10 12 10 1 1 1 1 1 1 1 12 10 1 8 1 100 1 100 1 100 8 8 8 8 8 1 1 12 10 1 100 1 12 10 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/util/text/StringFactory 1 1 105 1 7 1 100 1 1 1 1 1 1 1 1 100 1 1 12 10 12 9 1 100 1 1 12 9 1 100 1 1 12 10 1 7 1 100 1 1 12 10 1 100 1 12 10 1 1 1 1 1 1 100 1 7 1 1 12 9 1 100 1 1 12 9 1 1 12 10 1 1 12 10 1 1 1 1 8 1 8 1 100 8 8 8 1 1 12 10 1 100 1 12 10 1 100 10 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/com/intellij/util/text/StringFactory ourConstructor Ljava/lang/reflect/Constructor; null +ciInstanceKlass org/jetbrains/kotlin/lexer/KtTokens 1 1 881 1 7 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 8 1 1 12 10 12 9 8 12 9 8 12 9 8 12 9 8 12 9 1 7 1 1 12 9 12 9 1 7 12 9 9 8 12 9 1 8 12 9 8 12 9 8 12 9 8 12 9 8 12 9 8 12 9 8 12 9 8 12 9 8 12 9 8 12 9 1 8 1 7 1 1 12 10 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 1 7 1 1 12 10 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 8 12 9 8 12 9 8 12 9 1 7 8 1 8 1 12 10 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 1 12 10 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 1 8 12 9 8 12 9 1 8 1 12 10 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 1 12 10 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 8 12 9 1 7 1 7 1 1 12 10 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 1 1 12 10 12 9 12 9 12 9 12 9 12 9 1 1 1 +staticfield org/jetbrains/kotlin/lexer/KtTokens EOF Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens RESERVED Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens BLOCK_COMMENT Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens EOL_COMMENT Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens SHEBANG_COMMENT Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DOC_COMMENT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/kdoc/lexer/KDocTokens$1 +staticfield org/jetbrains/kotlin/lexer/KtTokens WHITE_SPACE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/com/intellij/psi/tree/IElementType +staticfield org/jetbrains/kotlin/lexer/KtTokens INTEGER_LITERAL Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens FLOAT_LITERAL Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens CHARACTER_LITERAL Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens CLOSING_QUOTE Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens OPEN_QUOTE Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens REGULAR_STRING_PART Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens ESCAPE_SEQUENCE Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens SHORT_TEMPLATE_ENTRY_START Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens LONG_TEMPLATE_ENTRY_START Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens LONG_TEMPLATE_ENTRY_END Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DANGLING_NEWLINE Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens PACKAGE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens AS_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens TYPE_ALIAS_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens CLASS_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens THIS_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens SUPER_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens VAL_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens VAR_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens FUN_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens FOR_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens NULL_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens TRUE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens FALSE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens IS_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens IN_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens THROW_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens RETURN_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens BREAK_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens CONTINUE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens OBJECT_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens IF_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens TRY_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens ELSE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens WHILE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DO_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens WHEN_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens INTERFACE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens TYPEOF_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens AS_SAFE Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens IDENTIFIER Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens FIELD_IDENTIFIER Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens LBRACKET Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens RBRACKET Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens LBRACE Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens RBRACE Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens LPAR Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens RPAR Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DOT Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens PLUSPLUS Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens MINUSMINUS Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens MUL Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens PLUS Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens MINUS Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens EXCL Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DIV Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens PERC Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens LT Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens GT Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens LTEQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens GTEQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens EQEQEQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens ARROW Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DOUBLE_ARROW Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens EXCLEQEQEQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens EQEQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens EXCLEQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens EXCLEXCL Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens ANDAND Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens OROR Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens SAFE_ACCESS Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens ELVIS Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens QUEST Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens COLONCOLON Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens COLON Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens SEMICOLON Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DOUBLE_SEMICOLON Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens RANGE Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens EQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens MULTEQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DIVEQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens PERCEQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens PLUSEQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens MINUSEQ Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens NOT_IN Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens NOT_IS Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens HASH Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens AT Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens COMMA Lorg/jetbrains/kotlin/lexer/KtSingleValueToken; org/jetbrains/kotlin/lexer/KtSingleValueToken +staticfield org/jetbrains/kotlin/lexer/KtTokens EOL_OR_SEMICOLON Lorg/jetbrains/kotlin/lexer/KtToken; org/jetbrains/kotlin/lexer/KtToken +staticfield org/jetbrains/kotlin/lexer/KtTokens FILE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens FIELD_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens PROPERTY_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens RECEIVER_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens PARAM_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens SETPARAM_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DELEGATE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens IMPORT_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens WHERE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens BY_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens GET_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens SET_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens CONSTRUCTOR_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens INIT_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens ABSTRACT_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens ENUM_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens CONTRACT_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens OPEN_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens INNER_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens OVERRIDE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens PRIVATE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens PUBLIC_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens INTERNAL_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens PROTECTED_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens CATCH_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens OUT_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens VARARG_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens REIFIED_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DYNAMIC_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens COMPANION_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens SEALED_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DEFAULT_VISIBILITY_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens FINALLY_KEYWORD Lorg/jetbrains/kotlin/lexer/KtKeywordToken; org/jetbrains/kotlin/lexer/KtKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens FINAL_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens LATEINIT_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens DATA_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens VALUE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens INLINE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens NOINLINE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens TAILREC_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens EXTERNAL_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens ANNOTATION_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens CROSSINLINE_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens OPERATOR_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens INFIX_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens CONST_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens SUSPEND_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens HEADER_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens IMPL_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens EXPECT_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens ACTUAL_KEYWORD Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; org/jetbrains/kotlin/lexer/KtModifierKeywordToken +staticfield org/jetbrains/kotlin/lexer/KtTokens KEYWORDS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens SOFT_KEYWORDS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens MODIFIER_KEYWORDS_ARRAY [Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; 35 [Lorg/jetbrains/kotlin/lexer/KtModifierKeywordToken; +staticfield org/jetbrains/kotlin/lexer/KtTokens MODIFIER_KEYWORDS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens TYPE_MODIFIER_KEYWORDS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens TYPE_ARGUMENT_MODIFIER_KEYWORDS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens RESERVED_VALUE_PARAMETER_MODIFIER_KEYWORDS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens VISIBILITY_MODIFIERS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens MODALITY_MODIFIERS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens WHITESPACES Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens COMMENTS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens WHITE_SPACE_OR_COMMENT_BIT_SET Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens STRINGS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens OPERATIONS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens AUGMENTED_ASSIGNMENTS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/lexer/KtTokens ALL_ASSIGNMENTS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +ciInstanceKlass java/util/EmptyStackException 0 0 21 10 100 100 1 1 1 5 0 1 1 1 1 1 1 1 1 1 12 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/TokenWrapper 0 0 84 1 100 1 100 1 1 1 1 1 1 1 1 12 9 1 1 12 10 1 1 1 1 12 9 1 100 1 1 100 1 1 12 10 1 8 1 1 12 10 1 12 10 1 8 12 10 1 8 1 8 1 100 1 100 1 8 1 8 8 8 8 8 1 1 12 10 1 100 1 12 10 1 100 10 1 100 1 1 1 1 1 1 1 +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl +ciInstanceKlass org/jetbrains/kotlin/com/intellij/openapi/util/UnprotectedUserDataHolder 1 1 95 1 7 1 7 1 100 1 100 1 1 1 1 1 1 12 10 1 1 1 1 1 1 1 1 1 12 10 12 9 1 7 1 1 12 11 1 100 1 1 12 10 1 1 12 10 1 1 1 1 1 1 1 1 7 10 1 1 12 11 1 12 10 1 1 8 8 8 1 100 1 100 8 8 8 8 1 1 12 10 1 100 1 12 10 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl 1 1 1255 1 7 1 7 1 100 1 1 100 1 1 100 1 1 100 1 1 7 1 1 7 1 1 100 1 1 7 1 1 7 1 1 100 1 1 100 1 1 100 1 1 100 1 1 7 1 1 7 1 1 100 1 1 100 1 100 1 1 100 1 100 1 100 1 7 1 1 7 1 7 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 7 12 9 1 7 1 1 12 10 1 1 12 10 1 1 1 1 1 7 1 100 1 7 1 7 1 100 1 7 1 7 1 1 12 11 1 100 1 12 10 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 12 10 1 1 12 10 1 12 9 1 1 12 11 1 7 1 1 12 10 1 12 10 1 1 1 100 1 12 11 1 1 12 11 1 1 12 10 1 1 12 10 1 7 10 12 9 1 7 1 12 10 12 9 1 7 10 12 9 1 7 1 12 10 12 9 12 9 12 9 12 9 12 9 1 7 1 1 12 10 12 9 12 9 1 1 12 11 12 9 1 12 11 12 9 12 9 12 9 12 9 1 100 1 100 1 100 10 1 8 1 1 12 10 1 12 10 1 8 1 8 1 100 1 1 12 10 1 12 10 1 12 10 12 9 1 1 12 10 12 9 1 1 12 10 1 7 1 12 9 12 9 1 12 9 12 9 1 12 9 12 9 1 1 1 1 1 1 1 12 10 1 1 12 10 1 1 12 10 12 9 1 12 11 1 100 10 1 7 1 12 10 1 7 12 9 10 1 1 12 10 1 1 12 10 1 1 12 10 1 12 10 1 1 1 1 1 1 1 1 1 1 12 10 1 1 12 10 1 1 1 1 1 1 10 1 1 1 12 9 1 8 1 12 10 12 9 1 1 12 10 1 12 10 1 1 12 10 1 1 1 12 9 1 12 10 1 1 1 12 9 12 9 1 100 1 1 12 11 12 10 1 12 10 1 12 10 1 1 12 9 12 10 1 1 1 1 1 12 10 1 1 1 12 10 1 1 1 12 10 1 1 1 12 9 1 1 12 10 1 1 12 10 1 100 11 1 1 1 1 10 1 7 1 12 10 1 1 12 11 11 1 12 10 1 1 1 1 12 10 1 1 12 10 1 12 10 1 12 9 1 12 10 1 1 1 8 12 10 1 1 1 12 10 1 1 1 1 1 12 10 1 1 12 10 1 1 12 10 1 12 10 1 12 10 1 100 1 1 12 9 1 1 12 10 1 1 12 10 1 1 12 10 1 1 1 1 1 1 1 1 12 10 12 9 1 8 1 7 1 12 10 1 12 10 1 1 12 10 9 1 1 12 10 1 1 12 10 9 1 1 1 1 1 1 1 12 10 1 12 10 1 12 11 1 1 12 10 1 1 12 10 1 12 10 1 1 12 10 1 7 1 1 12 10 1 7 1 7 1 1 12 10 1 12 9 1 100 1 1 12 9 11 1 12 10 1 12 10 1 1 1 1 1 1 1 1 1 1 1 12 10 10 1 7 1 1 12 10 1 1 12 10 1 1 12 10 10 1 100 10 1 12 9 10 1 7 1 100 10 1 12 10 1 100 1 1 12 11 12 9 10 1 100 1 12 10 1 1 12 10 1 100 10 1 100 1 100 1 1 12 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 8 1 7 1 1 12 10 1 1 12 10 1 12 10 1 12 10 1 12 9 1 1 12 10 1 12 10 1 12 9 1 7 10 1 12 10 1 12 10 9 1 12 10 1 1 12 10 1 1 12 10 1 100 1 1 12 10 1 8 1 8 1 1 12 11 1 8 1 8 1 8 1 12 10 1 8 1 8 1 7 1 1 12 10 1 1 1 1 1 1 1 1 1 1 1 1 1 7 10 1 12 10 1 1 12 10 1 7 1 1 12 10 1 8 1 8 1 8 1 1 1 12 10 10 1 1 12 10 1 1 12 10 1 12 10 1 1 12 10 1 1 12 10 1 1 12 11 1 1 12 10 1 1 12 10 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 12 9 1 1 12 10 11 1 1 1 1 1 12 10 1 1 12 10 1 1 12 10 1 1 12 10 1 1 12 10 1 1 12 10 1 100 1 1 12 10 9 1 1 1 1 1 1 1 12 10 1 100 1 1 12 10 1 1 100 100 1 12 10 1 12 10 1 1 1 1 1 1 12 11 1 1 7 1 12 9 1 12 9 1 1 12 10 1 100 1 8 10 1 12 10 1 12 10 1 12 10 1 12 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 11 1 7 1 12 10 1 7 1 1 12 11 1 12 10 1 100 12 10 1 1 7 1 12 9 10 1 1 1 10 1 1 1 12 10 1 12 10 1 1 1 1 1 1 1 1 1 1 1 12 10 1 1 1 12 10 1 1 1 1 12 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 12 10 1 1 12 10 8 1 7 1 12 10 8 1 12 9 1 8 1 8 1 100 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 1 1 12 10 1 100 10 1 1 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl LOG Lorg/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger; org/jetbrains/kotlin/com/intellij/openapi/diagnostic/DefaultLogger +staticfield org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl CUSTOM_COMPARATOR Lorg/jetbrains/kotlin/com/intellij/openapi/util/Key; org/jetbrains/kotlin/com/intellij/openapi/util/Key +staticfield org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl LAZY_PARSEABLE_TOKENS Lorg/jetbrains/kotlin/com/intellij/openapi/util/Key; org/jetbrains/kotlin/com/intellij/openapi/util/Key +staticfield org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl $assertionsDisabled Z 1 +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$ErrorItem +ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$ProductionMarker 1 1 117 1 7 1 7 1 100 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 12 10 12 9 12 9 12 9 1 1 1 12 9 12 9 1 1 1 1 12 10 1 1 12 10 1 1 1 100 1 8 1 12 10 1 1 1 1 1 1 1 1 1 1 1 8 1 100 1 100 8 8 8 8 8 1 1 12 10 1 100 10 1 1 1 1 1 1 1 1 1 1 100 1 8 1 1 12 10 1 1 1 8 1 1 1 8 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/SyntaxTreeBuilder$Marker 1 0 25 1 100 1 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker 1 0 25 1 100 1 100 1 100 1 1 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker 1 1 322 1 7 1 7 1 100 1 1 7 1 1 1 100 1 1 100 1 1 100 1 100 1 1 1 1 1 1 1 1 1 12 10 12 9 1 1 1 1 1 1 1 12 10 1 12 9 1 1 12 10 12 9 1 7 1 12 10 12 9 12 9 12 9 1 1 1 100 1 8 1 12 10 1 100 1 1 12 11 1 1 1 1 1 12 10 1 12 10 1 1 12 10 1 1 1 1 12 10 1 12 10 1 100 1 1 1 1 1 12 9 1 1 1 1 1 1 12 9 1 1 1 1 1 12 10 1 1 1 12 10 1 7 1 1 12 10 1 1 1 12 10 1 1 7 1 12 9 1 1 12 10 1 8 1 100 12 10 1 100 1 1 12 10 1 1 12 10 1 1 12 10 1 12 10 1 1 1 8 1 1 1 1 1 12 10 1 100 1 1 12 10 1 1 12 10 9 1 1 12 10 12 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 1 1 1 1 1 8 1 1 12 10 1 1 12 10 1 12 10 12 10 1 12 10 1 1 12 11 12 11 1 100 10 1 1 12 10 1 8 1 12 10 10 1 100 1 1 1 1 1 12 10 1 1 1 1 1 1 1 1 1 1 1 1 8 1 8 1 100 1 100 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 1 1 12 10 1 100 10 1 1 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/util/containers/Stack 1 1 116 1 7 1 1 7 1 1 1 12 10 1 1 1 1 12 10 1 1 1 1 1 1 12 10 12 10 1 1 1 1 1 1 100 1 1 12 10 1 1 1 1 1 1 1 1 12 10 1 1 1 1 1 1 12 10 1 100 10 1 1 12 10 1 1 12 10 1 1 1 12 10 1 1 100 1 100 11 11 1 100 12 10 10 1 1 1 1 1 1 1 1 8 1 100 8 8 8 8 1 1 12 10 1 100 1 12 10 1 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/MarkerPool 1 1 89 1 7 1 1 7 1 1 7 1 100 1 1 7 1 1 7 1 1 1 1 1 1 1 1 1 12 10 1 7 10 12 9 12 9 12 9 1 1 12 10 1 1 1 1 1 1 1 12 10 1 12 10 1 1 12 10 10 1 12 10 1 1 1 1 10 1 1 1 1 1 12 10 1 1 12 9 1 1 12 10 1 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/MarkerOptionalData 1 1 168 1 7 1 7 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 7 10 12 9 12 9 12 9 12 9 1 7 10 12 9 1 1 1 1 1 1 12 10 1 1 12 10 1 1 12 10 12 10 1 1 1 12 10 10 1 1 1 12 10 1 100 1 1 12 10 1 1 1 1 12 10 1 12 10 1 1 12 10 1 1 1 1 12 10 12 10 1 1 100 1 8 1 12 10 1 1 12 9 1 1 1 1 1 1 12 10 1 7 1 1 12 10 1 1 1 1 1 1 1 1 7 1 12 9 1 12 9 1 1 8 1 100 1 100 8 8 8 8 8 1 1 12 10 1 100 10 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction +ciInstanceKlass gnu/trove/TIntArrayList 1 1 289 10 9 9 7 10 10 10 10 10 10 10 10 10 10 100 10 10 10 10 10 11 10 100 8 10 10 10 10 10 100 100 10 10 11 10 10 10 10 10 10 10 10 100 8 10 8 10 100 8 10 100 10 10 8 10 10 10 10 100 10 9 10 10 7 100 100 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1 12 12 12 1 100 12 12 12 7 12 12 12 12 12 12 12 1 12 12 12 12 100 12 12 1 1 12 12 100 12 12 100 1 12 100 12 100 12 12 100 12 12 12 12 12 12 1 1 1 12 1 1 1 12 12 1 12 12 100 12 12 1 12 12 100 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction 1 1 323 1 7 1 7 1 1 7 1 100 1 1 7 1 1 100 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 12 10 12 9 12 9 1 1 1 1 1 1 1 1 12 10 1 1 12 9 1 1 12 10 1 1 1 1 1 12 10 1 1 12 10 1 12 10 1 12 10 12 9 1 8 1 7 1 1 12 10 1 1 1 12 10 1 7 1 12 10 1 1 12 9 1 1 16 1 12 10 15 1 7 1 1 12 10 15 1 1 12 18 1 7 1 1 12 10 1 12 10 1 1 12 10 1 1 1 1 12 10 1 1 7 1 1 12 10 1 12 10 1 12 10 1 1 1 1 12 10 1 1 12 10 1 1 12 10 1 1 1 100 1 1 12 10 1 1 1 1 12 10 9 1 12 10 12 10 1 1 1 1 1 12 10 1 1 1 1 1 12 10 1 1 1 1 12 10 1 1 1 1 1 1 1 8 1 1 12 10 1 100 1 12 10 1 100 1 1 12 10 1 100 1 1 12 9 1 1 12 10 1 8 1 1 1 1 1 1 1 1 1 12 10 1 12 9 1 100 1 100 10 1 8 1 1 12 10 1 1 12 10 1 12 10 1 8 1 1 12 10 1 12 10 1 1 1 7 1 12 10 1 1 1 1 12 10 1 8 1 100 1 100 1 100 8 8 8 8 8 8 8 8 1 1 12 10 1 100 12 10 1 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction LOG Lorg/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger; org/jetbrains/kotlin/com/intellij/openapi/diagnostic/DefaultLogger +ciInstanceKlass org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilder 1 0 22 1 100 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass org/jetbrains/kotlin/com/intellij/lang/java/parser/JavaParserUtil$1 +instanceKlass org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl +ciInstanceKlass org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter 1 1 211 1 7 1 7 1 7 1 1 100 1 1 100 1 100 1 1 1 1 1 1 1 12 10 1 12 10 12 9 1 1 1 1 1 1 1 12 11 1 1 12 11 1 100 1 12 11 1 1 1 12 11 1 1 12 11 1 1 1 1 12 11 1 1 1 1 12 11 1 1 1 1 12 11 1 1 1 12 11 1 1 12 11 1 1 12 11 1 1 1 12 11 1 12 11 1 1 12 11 1 1 12 11 1 1 1 1 12 11 1 1 12 11 1 100 1 1 1 12 11 1 100 1 1 12 11 1 1 1 1 12 11 1 1 1 1 12 11 1 1 1 12 11 1 1 1 1 1 1 12 11 1 1 1 1 12 11 1 12 11 1 10 1 8 1 8 1 100 1 100 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 1 1 12 10 1 100 12 10 1 100 10 1 100 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl 1 1 267 1 7 1 7 1 100 1 1 7 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 7 1 7 1 1 12 9 1 12 9 1 12 9 1 7 1 1 12 10 12 9 1 7 1 12 10 12 9 12 9 1 7 1 1 12 10 1 1 12 10 1 1 12 10 12 9 1 1 1 1 1 1 7 1 1 12 10 1 1 1 1 1 1 12 10 12 9 1 100 1 8 12 10 1 12 10 1 1 1 1 1 1 12 10 1 12 10 1 12 10 1 1 12 10 1 1 12 10 1 1 12 9 1 12 9 1 12 9 1 12 9 1 7 1 12 9 1 1 12 10 10 1 1 12 10 1 7 1 12 11 1 1 12 11 1 1 1 1 1 1 1 1 1 1 12 10 1 12 10 1 1 1 1 1 12 10 12 10 1 1 12 10 1 12 9 1 12 9 1 12 9 1 12 9 1 1 1 1 12 10 10 1 12 10 1 1 12 10 1 1 12 11 1 1 1 1 12 10 1 8 1 8 1 12 10 1 1 1 7 1 12 10 1 8 1 100 8 8 8 1 100 1 1 12 10 1 100 1 12 10 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl $assertionsDisabled Z 1 +instanceKlass org/jetbrains/kotlin/parsing/KotlinExpressionParsing +instanceKlass org/jetbrains/kotlin/parsing/KotlinParsing +ciInstanceKlass org/jetbrains/kotlin/parsing/AbstractKotlinParsing 1 1 426 1 7 1 7 1 1 100 1 1 100 1 1 100 1 1 7 1 100 1 1 1 1 1 1 1 1 1 1 1 12 10 12 9 1 1 1 1 1 1 7 1 1 12 11 1 7 1 1 12 9 1 1 12 11 1 7 1 1 12 10 1 1 1 1 1 1 12 10 1 1 1 1 1 1 12 11 1 1 12 11 1 12 10 1 12 10 1 12 9 1 8 1 1 12 11 1 7 1 1 12 10 1 1 12 10 1 1 1 10 1 12 10 1 1 12 9 1 12 9 1 12 9 1 12 9 1 1 12 10 1 12 9 1 12 11 1 12 10 1 1 12 10 10 1 12 10 11 1 1 1 11 1 12 11 1 1 12 9 1 12 10 1 100 10 1 1 12 11 1 1 12 10 1 1 7 1 12 10 1 12 10 1 12 11 1 100 1 1 1 1 1 1 1 12 10 1 12 10 1 1 1 1 12 10 12 9 1 7 1 1 12 11 1 1 12 11 1 1 1 1 1 1 1 1 1 8 1 12 10 1 8 12 10 1 1 1 12 11 1 1 1 1 1 7 10 1 7 1 1 12 11 1 1 12 11 1 12 9 1 12 10 1 12 9 1 12 9 1 12 9 1 12 10 1 1 12 10 1 12 11 1 12 9 1 12 9 1 12 11 1 12 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 12 11 1 7 1 1 12 9 1 7 1 12 9 1 100 1 7 1 12 9 1 1 12 11 1 1 1 1 1 1 100 1 12 10 12 10 1 1 1 1 12 11 1 100 1 1 12 10 1 1 7 1 12 10 1 7 10 1 12 9 1 1 12 10 100 1 1 12 11 1 12 9 1 100 10 1 8 1 1 12 10 1 12 10 1 12 10 1 8 1 1 8 1 100 8 8 8 8 1 1 12 10 1 100 12 10 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/parsing/AbstractKotlinParsing SOFT_KEYWORD_TEXTS Ljava/util/Map; java/util/HashMap +staticfield org/jetbrains/kotlin/parsing/AbstractKotlinParsing $assertionsDisabled Z 1 +ciInstanceKlass org/jetbrains/kotlin/parsing/KotlinParsing 1 1 1543 1 7 1 7 1 1 7 1 7 1 1 7 1 1 100 1 1 7 1 1 7 1 1 7 1 1 7 1 100 1 100 1 7 1 100 1 1 7 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 7 1 12 10 12 9 1 1 1 1 1 1 100 10 1 12 10 1 1 10 1 1 1 1 1 12 10 1 12 10 1 1 12 10 1 12 10 1 12 10 1 7 1 1 12 9 1 1 12 11 1 1 1 7 1 7 1 1 12 9 1 1 12 9 1 7 1 1 12 10 1 12 9 1 7 1 1 12 11 1 1 12 10 1 1 12 11 1 1 12 11 1 100 1 1 12 11 1 1 12 11 1 1 12 11 1 8 1 100 1 1 12 10 11 1 8 1 1 12 11 1 100 1 1 12 9 1 1 12 11 1 1 1 1 1 1 1 1 12 10 1 12 10 1 12 9 1 1 12 10 1 12 9 1 1 1 12 9 1 12 10 1 12 9 1 8 1 12 10 1 12 9 1 12 9 1 1 1 1 1 12 10 1 1 1 12 10 1 12 10 1 100 1 12 9 1 12 9 1 12 9 1 1 8 1 12 10 1 1 12 9 1 1 12 10 1 12 9 1 12 9 1 1 12 10 1 12 10 1 12 10 1 12 11 1 1 12 9 1 1 12 10 1 12 9 1 12 11 1 12 9 1 100 1 1 12 9 1 12 10 1 1 1 12 11 1 8 12 9 1 1 12 10 1 12 9 1 8 1 12 9 1 1 12 10 1 12 9 1 12 11 1 12 9 1 1 1 1 1 1 12 9 1 12 10 1 100 12 10 1 8 1 1 12 10 1 12 9 1 1 12 10 1 12 9 1 12 10 1 12 9 1 8 1 8 12 9 1 12 9 1 8 1 12 9 1 8 1 7 1 12 9 1 1 1 1 1 1 10 1 1 1 1 100 1 12 9 12 10 1 12 9 1 10 1 12 10 1 1 12 9 1 1 12 9 1 1 12 10 1 12 9 1 8 12 10 1 12 9 1 8 1 1 12 10 1 1 1 1 1 1 1 12 10 1 1 12 10 1 12 9 1 12 9 1 12 10 1 1 12 10 1 1 12 9 1 12 10 1 12 9 1 12 9 1 1 12 10 1 12 9 1 12 10 1 12 9 1 1 12 10 1 12 9 1 12 9 1 1 1 1 1 1 1 1 12 10 1 1 12 9 1 1 1 1 1 12 9 1 12 9 12 9 1 1 12 9 1 12 9 1 1 12 9 1 12 9 1 12 9 1 12 9 1 1 1 12 9 1 12 9 1 1 12 10 1 12 9 1 12 9 12 10 1 7 1 1 12 10 1 1 1 1 1 12 9 1 1 1 1 12 10 1 1 12 11 1 12 11 1 12 9 12 9 1 7 10 1 8 1 1 12 10 1 12 10 10 1 7 10 1 12 10 1 12 9 1 1 12 9 1 12 10 1 12 9 1 12 10 1 8 1 12 10 1 8 1 1 1 1 12 11 1 12 10 1 12 11 1 8 1 8 1 8 1 12 9 1 8 1 12 10 1 12 9 1 1 8 1 1 12 10 1 12 9 1 100 1 1 12 10 1 1 1 8 1 12 10 1 100 10 1 8 1 8 1 12 9 1 1 1 1 12 10 1 100 1 1 12 10 1 8 12 10 1 12 10 1 12 9 1 12 9 1 12 10 1 12 9 1 12 9 1 12 10 1 12 9 1 12 10 1 12 9 1 12 9 1 12 9 1 1 1 1 1 1 1 1 12 10 1 8 1 8 1 8 12 9 1 8 1 12 9 1 8 1 12 9 12 9 1 12 10 1 12 9 12 10 1 12 9 1 12 9 1 1 12 10 1 12 9 1 8 1 8 1 12 10 1 12 10 1 12 10 1 8 10 1 12 10 1 12 10 1 8 1 12 9 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 12 11 1 12 10 1 8 1 12 10 1 8 1 1 1 12 9 1 1 12 10 1 12 10 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 1 12 9 1 12 9 1 12 9 1 12 9 1 1 1 1 1 1 1 1 1 8 1 12 10 1 1 12 10 1 8 1 12 10 1 12 9 1 8 1 12 9 1 12 10 1 12 9 1 1 8 1 1 12 10 1 12 9 1 12 9 1 12 10 1 8 1 12 9 1 12 9 1 1 1 1 1 8 1 12 9 1 12 9 12 9 1 12 9 1 12 10 1 8 1 8 1 12 9 1 12 11 1 8 1 1 12 10 1 8 1 1 12 10 1 12 10 1 12 10 1 12 9 1 8 1 1 12 10 1 12 11 1 8 1 12 10 1 8 1 12 9 1 12 9 1 1 12 10 1 8 12 9 1 12 10 1 12 9 1 1 1 1 1 1 1 1 1 1 1 1 12 9 1 12 10 1 12 9 1 12 9 1 8 12 10 1 12 9 1 8 1 1 1 12 9 1 12 9 1 12 9 1 12 9 1 8 1 12 9 1 8 1 12 9 1 12 9 1 12 10 1 12 10 1 1 1 1 1 1 12 10 1 1 1 1 8 1 8 1 12 11 12 10 1 8 1 1 1 1 1 1 1 1 12 10 1 8 1 1 12 10 12 9 1 8 1 8 1 1 1 1 1 1 1 100 1 12 10 1 12 10 1 12 10 1 1 12 10 1 7 10 10 1 1 8 1 8 1 1 8 1 8 1 12 10 1 8 1 1 1 1 1 8 1 12 10 1 12 9 12 10 1 12 9 1 12 9 1 1 8 1 12 10 1 8 1 12 9 1 1 8 1 1 12 10 1 8 1 12 10 1 12 9 1 8 12 9 1 8 1 12 9 1 1 12 9 1 12 10 1 8 1 8 1 12 9 1 1 12 10 1 1 12 10 1 12 9 1 12 9 1 1 12 10 1 12 10 1 8 1 1 12 10 1 12 9 1 12 10 1 8 1 12 9 1 1 1 1 1 1 1 1 1 12 9 1 12 9 1 8 1 8 1 8 1 1 12 10 1 8 1 12 9 1 12 9 1 12 10 1 1 1 12 11 1 8 1 1 12 9 1 8 1 12 10 1 12 9 1 8 12 10 1 12 9 1 8 1 1 1 8 1 8 1 1 12 10 12 10 1 12 10 1 8 12 9 12 9 1 1 1 1 1 12 10 1 12 10 1 1 1 8 1 8 1 8 1 12 10 1 12 10 1 1 1 1 12 10 1 1 7 1 12 10 1 1 12 10 1 12 9 1 12 9 1 1 12 10 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 8 1 8 1 100 1 100 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 1 1 12 10 1 100 12 10 1 100 10 1 100 1 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/parsing/KotlinParsing LOG Lorg/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger; org/jetbrains/kotlin/com/intellij/openapi/diagnostic/DefaultLogger +staticfield org/jetbrains/kotlin/parsing/KotlinParsing TOP_LEVEL_DECLARATION_FIRST Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing DECLARATION_FIRST Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing CLASS_NAME_RECOVERY_SET Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing TYPE_PARAMETER_GT_RECOVERY_SET Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing PARAMETER_NAME_RECOVERY_SET Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing PACKAGE_NAME_RECOVERY_SET Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing IMPORT_RECOVERY_SET Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing TYPE_REF_FIRST Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing RECEIVER_TYPE_TERMINATORS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing VALUE_PARAMETER_FIRST Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing LAMBDA_VALUE_PARAMETER_FIRST Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing SOFT_KEYWORDS_AT_MEMBER_START Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing ANNOTATION_TARGETS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing NO_MODIFIER_BEFORE_FOR_VALUE_PARAMETER Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinParsing $assertionsDisabled Z 1 +instanceKlass org/jetbrains/kotlin/parsing/KotlinParsing$1 +ciInstanceKlass org/jetbrains/kotlin/parsing/KotlinExpressionParsing 1 1 1352 1 7 1 7 1 1 100 1 7 1 1 7 1 7 1 1 7 1 100 1 1 7 1 7 1 1 7 1 1 7 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 7 1 1 12 10 7 1 7 1 1 12 10 1 7 1 1 12 10 1 1 12 10 1 1 1 1 1 1 1 1 12 10 12 9 1 1 1 1 1 1 12 9 1 1 12 10 1 8 1 1 12 10 1 1 12 9 1 1 12 10 1 1 12 10 1 1 12 10 1 1 12 10 1 1 12 10 1 1 12 10 1 12 10 1 1 12 10 1 1 12 11 1 12 11 1 12 11 1 1 1 1 1 1 1 12 10 1 12 10 1 7 1 12 9 1 7 1 1 12 9 1 1 12 10 1 1 12 10 1 1 12 9 1 1 12 10 1 12 9 1 12 9 1 7 1 12 11 1 12 10 1 12 11 12 10 1 12 9 1 12 9 1 12 10 1 1 1 1 1 12 10 1 12 9 1 12 10 1 1 12 9 1 12 9 1 12 10 1 12 9 12 9 1 12 10 1 8 11 1 12 11 1 12 9 1 12 11 1 12 10 1 8 1 12 9 1 1 1 1 12 9 1 1 12 10 1 1 12 10 1 12 10 1 12 9 1 12 10 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 10 1 12 9 1 12 9 12 10 1 1 1 12 10 1 12 10 1 12 9 1 12 9 1 1 1 12 10 1 12 9 1 1 1 12 9 1 1 12 10 1 1 12 10 1 1 1 1 1 1 1 1 1 1 12 9 1 12 11 1 12 10 1 12 10 1 12 9 1 12 10 1 12 9 1 12 10 1 12 9 1 12 10 1 12 9 1 12 10 1 12 9 1 12 10 1 12 9 1 12 9 1 12 10 1 12 9 1 12 9 1 12 9 1 12 10 1 12 9 1 12 10 1 12 9 1 12 10 1 12 9 1 12 10 1 12 9 1 12 10 1 12 9 1 12 10 12 9 1 12 10 12 10 1 12 9 1 12 10 1 12 10 1 8 12 9 1 1 12 10 1 12 9 1 12 10 1 100 12 10 1 12 10 1 12 9 1 12 9 1 12 10 1 8 1 12 10 1 1 12 10 1 12 9 1 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 12 9 1 12 11 1 1 12 10 1 12 11 1 8 1 8 1 12 9 1 12 9 1 1 12 11 12 10 1 12 9 1 8 1 12 9 1 8 1 1 1 1 1 1 1 12 9 1 12 9 1 12 9 1 12 10 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 11 1 12 10 1 12 9 1 12 9 1 1 12 10 1 1 12 10 1 12 9 1 12 9 1 1 12 9 1 1 12 10 1 100 1 1 12 9 1 100 1 12 9 1 1 12 11 1 8 1 12 11 1 12 11 1 8 1 12 9 1 12 10 1 12 9 1 1 1 1 12 9 1 12 9 1 8 1 12 9 1 12 10 12 9 1 12 10 1 12 10 1 12 9 1 12 9 1 1 12 10 1 12 9 1 8 1 12 10 1 12 10 1 1 12 9 1 12 9 12 9 1 12 9 1 12 9 1 12 9 1 8 1 12 10 1 12 9 1 8 1 12 9 1 12 9 1 8 1 1 12 10 1 12 9 1 12 9 1 100 1 12 10 1 8 1 1 1 1 1 1 1 12 9 1 12 10 1 8 1 12 10 1 12 9 1 1 8 1 12 9 1 1 8 1 10 1 12 9 1 1 12 10 1 1 12 10 1 12 9 1 12 9 1 12 10 1 1 1 1 1 1 12 9 1 12 9 1 12 10 1 8 1 1 12 10 1 1 12 10 1 12 10 1 12 9 1 12 10 1 12 9 1 12 9 1 12 11 1 100 1 1 12 9 1 12 9 1 1 1 1 1 1 1 1 1 1 1 1 8 12 9 1 1 12 10 12 10 1 12 9 1 8 1 1 1 1 12 10 12 9 1 12 10 1 8 12 9 1 1 8 1 12 10 1 12 9 1 1 1 12 9 1 1 12 10 1 1 12 9 1 12 9 1 1 12 10 1 1 1 1 12 10 1 8 1 12 10 1 12 9 1 1 12 9 1 8 12 10 1 8 1 8 1 12 9 1 1 12 10 1 12 9 1 1 12 9 1 12 10 1 12 9 1 12 9 1 8 1 8 1 12 10 1 8 1 12 9 1 12 9 1 8 1 12 9 1 1 1 1 1 1 1 12 9 1 12 9 1 12 9 1 1 1 8 1 12 9 1 8 1 12 10 1 12 9 1 1 12 9 1 12 10 1 8 1 12 10 1 8 1 12 10 1 12 9 1 12 9 1 1 8 1 12 9 1 12 9 1 1 12 9 1 12 9 1 1 1 8 1 8 1 12 10 1 8 1 12 10 1 8 1 12 9 1 1 12 9 1 12 9 1 12 9 1 1 12 9 1 1 12 10 1 12 9 1 12 9 1 1 12 10 12 9 1 12 10 1 1 1 1 1 1 1 1 1 7 1 12 10 1 12 9 12 10 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 1 12 10 1 1 12 10 1 12 10 1 12 9 1 7 10 1 1 12 10 1 100 1 7 1 1 12 10 1 7 1 1 12 11 1 12 11 1 1 12 11 12 9 1 12 9 1 12 10 1 12 11 1 8 1 12 11 1 100 10 1 1 1 1 1 1 1 8 1 100 8 8 8 8 8 8 8 8 1 1 12 10 1 100 12 10 1 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing WHEN_CONDITION_RECOVERY_SET Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing WHEN_CONDITION_RECOVERY_SET_WITH_ARROW Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing KEYWORD_TEXTS Lorg/jetbrains/kotlin/com/google/common/collect/ImmutableMap; org/jetbrains/kotlin/com/google/common/collect/RegularImmutableMap +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing LOCAL_DECLARATION_FIRST [Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 6 [Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing TOKEN_SET_TO_FOLLOW_AFTER_DESTRUCTURING_DECLARATION_IN_LAMBDA Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing TYPE_ARGUMENT_LIST_STOPPERS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing EXPRESSION_FIRST Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing STATEMENT_FIRST Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing STATEMENT_NEW_LINE_QUICK_RECOVERY_SET Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing EXPRESSION_FOLLOW Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing ALLOW_NEWLINE_OPERATIONS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing ALL_OPERATIONS Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing $assertionsDisabled Z 1 +instanceKlass org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence$3 +instanceKlass org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence$2 +instanceKlass org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence$1 +ciInstanceKlass org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence 1 1 314 1 7 1 1 7 1 1 7 1 1 7 1 7 1 7 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 9 7 1 1 12 10 1 1 1 12 10 1 1 1 1 1 1 12 10 1 7 1 1 12 10 12 9 1 1 1 1 12 9 12 9 1 100 1 12 10 1 1 12 10 1 1 1 1 12 10 1 7 1 1 12 9 1 1 1 1 1 1 12 10 1 12 10 1 1 1 1 1 1 1 1 7 1 1 12 10 8 1 7 1 7 1 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 12 9 8 1 12 9 1 12 9 1 12 9 10 12 9 8 1 1 12 9 1 1 12 9 10 12 9 8 1 12 9 1 12 9 1 12 9 12 9 8 12 9 8 12 9 12 9 8 1 12 9 12 9 8 12 9 12 9 8 1 1 12 9 1 12 9 1 12 9 1 12 9 10 12 9 8 1 12 9 1 12 9 1 12 9 1 12 9 12 9 8 1 12 9 1 12 9 1 12 9 1 12 9 12 9 8 1 12 9 12 9 8 1 12 9 12 9 8 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 1 12 9 12 9 12 10 1 1 12 10 1 1 8 1 100 8 8 1 100 1 1 12 10 1 100 1 12 10 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence POSTFIX Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence PREFIX Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence$1 +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence AS Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence$2 +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence MULTIPLICATIVE Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence ADDITIVE Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence RANGE Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence SIMPLE_NAME Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence ELVIS Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence IN_OR_IS Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence$3 +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence COMPARISON Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence EQUALITY Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence CONJUNCTION Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence DISJUNCTION Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence ASSIGNMENT Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence $VALUES [Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; 14 [Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence; +staticfield org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence $assertionsDisabled Z 1 +ciInstanceKlass org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence$2 1 1 52 1 100 1 7 1 1 7 1 1 100 1 1 1 12 10 1 1 1 1 1 1 1 1 12 10 1 7 1 1 12 10 1 7 1 1 12 9 1 1 1 1 1 1 12 10 1 1 1 1 1 1 +ciInstanceKlass org/jetbrains/kotlin/KtNodeTypes 1 1 681 1 7 1 100 1 1 7 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 7 1 1 12 9 1 1 12 10 12 9 1 7 1 12 9 12 9 1 1 12 9 12 9 1 12 9 12 9 8 1 7 1 12 10 12 9 8 1 7 12 9 1 12 9 12 9 1 12 9 12 9 12 9 12 9 1 12 9 12 9 8 1 7 12 9 12 9 12 9 12 9 12 9 12 9 12 9 1 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 8 1 7 12 9 12 9 12 9 12 9 12 9 1 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 1 12 9 12 9 1 12 9 12 9 1 12 9 12 9 12 9 12 9 1 12 9 12 9 1 12 9 12 9 12 9 12 9 12 9 12 9 1 12 9 12 9 12 9 12 9 1 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 1 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 1 12 9 12 9 1 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 8 1 7 10 12 9 8 1 7 12 9 1 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 1 12 9 12 9 12 9 12 9 12 9 12 9 12 9 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 12 9 8 12 9 1 7 12 10 12 9 1 7 10 12 9 8 1 7 12 9 8 1 7 12 9 1 12 9 12 9 1 12 9 12 9 8 1 7 12 9 8 1 7 12 9 8 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 12 9 1 12 9 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 8 1 7 12 9 1 8 1 7 12 9 8 1 7 12 9 12 9 12 9 1 12 9 12 9 1 12 9 12 9 1 12 9 12 9 1 12 9 12 9 1 1 1 1 +staticfield org/jetbrains/kotlin/KtNodeTypes KT_FILE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IFileElementType; org/jetbrains/kotlin/com/intellij/psi/tree/IFileElementType +staticfield org/jetbrains/kotlin/KtNodeTypes CLASS Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtClassElementType +staticfield org/jetbrains/kotlin/KtNodeTypes FUN Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtFunctionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes PROPERTY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPropertyElementType +staticfield org/jetbrains/kotlin/KtNodeTypes DESTRUCTURING_DECLARATION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes DESTRUCTURING_DECLARATION_ENTRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes OBJECT_DECLARATION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtObjectElementType +staticfield org/jetbrains/kotlin/KtNodeTypes TYPEALIAS Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtTypeAliasElementType +staticfield org/jetbrains/kotlin/KtNodeTypes ENUM_ENTRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtClassElementType +staticfield org/jetbrains/kotlin/KtNodeTypes CLASS_INITIALIZER Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes SCRIPT_INITIALIZER Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes SECONDARY_CONSTRUCTOR Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes PRIMARY_CONSTRUCTOR Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes TYPE_PARAMETER_LIST Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes TYPE_PARAMETER Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtTypeParameterElementType +staticfield org/jetbrains/kotlin/KtNodeTypes SUPER_TYPE_LIST Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes DELEGATED_SUPER_TYPE_ENTRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes SUPER_TYPE_CALL_ENTRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes SUPER_TYPE_ENTRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes PROPERTY_DELEGATE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes CONSTRUCTOR_CALLEE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes VALUE_PARAMETER_LIST Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes VALUE_PARAMETER Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtParameterElementType +staticfield org/jetbrains/kotlin/KtNodeTypes CLASS_BODY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes IMPORT_LIST Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes FILE_ANNOTATION_LIST Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes IMPORT_DIRECTIVE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtImportDirectiveElementType +staticfield org/jetbrains/kotlin/KtNodeTypes IMPORT_ALIAS Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtImportAliasElementType +staticfield org/jetbrains/kotlin/KtNodeTypes MODIFIER_LIST Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtModifierListElementType +staticfield org/jetbrains/kotlin/KtNodeTypes ANNOTATION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes ANNOTATION_ENTRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtAnnotationEntryElementType +staticfield org/jetbrains/kotlin/KtNodeTypes ANNOTATION_TARGET Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtAnnotationUseSiteTargetElementType +staticfield org/jetbrains/kotlin/KtNodeTypes TYPE_ARGUMENT_LIST Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes VALUE_ARGUMENT_LIST Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtValueArgumentListElementType +staticfield org/jetbrains/kotlin/KtNodeTypes VALUE_ARGUMENT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtValueArgumentElementType +staticfield org/jetbrains/kotlin/KtNodeTypes CONTRACT_EFFECT_LIST Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtContractEffectListElementType +staticfield org/jetbrains/kotlin/KtNodeTypes CONTRACT_EFFECT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtContractEffectElementType +staticfield org/jetbrains/kotlin/KtNodeTypes LAMBDA_ARGUMENT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtValueArgumentElementType +staticfield org/jetbrains/kotlin/KtNodeTypes VALUE_ARGUMENT_NAME Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes TYPE_REFERENCE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes USER_TYPE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtUserTypeElementType +staticfield org/jetbrains/kotlin/KtNodeTypes DYNAMIC_TYPE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes FUNCTION_TYPE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes FUNCTION_TYPE_RECEIVER Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes NULLABLE_TYPE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes TYPE_PROJECTION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtTypeProjectionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes PROPERTY_ACCESSOR Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPropertyAccessorElementType +staticfield org/jetbrains/kotlin/KtNodeTypes INITIALIZER_LIST Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes TYPE_CONSTRAINT_LIST Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes TYPE_CONSTRAINT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes CONSTRUCTOR_DELEGATION_CALL Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType$KtLeftBoundNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes CONSTRUCTOR_DELEGATION_REFERENCE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType$KtLeftBoundNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes NULL Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtConstantExpressionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes BOOLEAN_CONSTANT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtConstantExpressionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes FLOAT_CONSTANT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtConstantExpressionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes CHARACTER_CONSTANT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtConstantExpressionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes INTEGER_CONSTANT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtConstantExpressionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes STRING_TEMPLATE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtStringTemplateExpressionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes LONG_STRING_TEMPLATE_ENTRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderWithTextStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes SHORT_STRING_TEMPLATE_ENTRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderWithTextStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes LITERAL_STRING_TEMPLATE_ENTRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderWithTextStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes ESCAPE_STRING_TEMPLATE_ENTRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderWithTextStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes PARENTHESIZED Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes RETURN Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes THROW Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes CONTINUE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes BREAK Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes IF Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes CONDITION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes THEN Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes ELSE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes TRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes CATCH Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes FINALLY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes FOR Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes WHILE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes DO_WHILE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes LOOP_RANGE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes BODY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes BLOCK Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/BlockExpressionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes LAMBDA_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/LambdaExpressionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes FUNCTION_LITERAL Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes ANNOTATED_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes REFERENCE_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtNameReferenceExpressionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes ENUM_ENTRY_SUPERCLASS_REFERENCE_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtEnumEntrySuperClassReferenceExpressionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes OPERATION_REFERENCE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes LABEL Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes LABEL_QUALIFIER Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes THIS_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes SUPER_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes BINARY_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes BINARY_WITH_TYPE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes IS_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes PREFIX_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes POSTFIX_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes LABELED_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes CALL_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes ARRAY_ACCESS_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes INDICES Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes DOT_QUALIFIED_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtDotQualifiedExpressionElementType +staticfield org/jetbrains/kotlin/KtNodeTypes CALLABLE_REFERENCE_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes CLASS_LITERAL_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes SAFE_ACCESS_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes OBJECT_LITERAL Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes WHEN Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes WHEN_ENTRY Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes WHEN_CONDITION_IN_RANGE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes WHEN_CONDITION_IS_PATTERN Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes WHEN_CONDITION_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes COLLECTION_LITERAL_EXPRESSION Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/KtNodeType +staticfield org/jetbrains/kotlin/KtNodeTypes PACKAGE_DIRECTIVE Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtPlaceHolderStubElementType +staticfield org/jetbrains/kotlin/KtNodeTypes SCRIPT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; org/jetbrains/kotlin/psi/stubs/elements/KtScriptElementType +staticfield org/jetbrains/kotlin/KtNodeTypes TYPE_CODE_FRAGMENT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IFileElementType; org/jetbrains/kotlin/psi/KtTypeCodeFragmentType +staticfield org/jetbrains/kotlin/KtNodeTypes EXPRESSION_CODE_FRAGMENT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IFileElementType; org/jetbrains/kotlin/psi/KtExpressionCodeFragmentType +staticfield org/jetbrains/kotlin/KtNodeTypes BLOCK_CODE_FRAGMENT Lorg/jetbrains/kotlin/com/intellij/psi/tree/IFileElementType; org/jetbrains/kotlin/psi/KtBlockCodeFragmentType +instanceKlass org/jetbrains/kotlin/KtNodeType$KtLeftBoundNodeType +ciInstanceKlass org/jetbrains/kotlin/KtNodeType 1 1 126 1 7 1 7 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 12 10 1 7 1 1 12 9 1 12 10 1 7 1 7 1 1 12 10 1 7 12 9 1 100 1 8 1 12 10 1 1 1 1 1 1 1 1 1 1 1 1 100 12 9 1 1 12 11 1 100 1 12 10 1 100 1 12 10 1 7 1 1 12 10 1 7 1 8 1 12 10 1 1 1 1 1 1 12 10 1 8 8 8 8 1 100 1 1 12 10 1 100 10 1 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/KtNodeType $assertionsDisabled Z 1 +ciInstanceKlass org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence 1 1 164 1 7 1 7 1 100 1 100 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 12 10 1 1 12 11 1 100 1 100 10 1 8 1 1 12 10 1 12 10 1 8 1 8 1 1 12 10 1 12 10 12 9 12 9 12 9 1 1 1 1 1 1 1 12 11 1 1 1 12 10 1 7 1 1 12 10 1 7 1 1 12 10 1 7 1 1 12 10 1 1 1 1 12 9 1 100 10 1 12 10 1 1 1 1 12 9 10 1 100 1 1 12 10 1 1 1 7 1 1 12 10 1 8 1 8 1 100 8 8 8 8 8 8 8 8 1 1 12 10 1 100 10 1 100 10 1 100 1 1 1 1 1 1 1 1 +staticfield org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence $assertionsDisabled Z 1 +ciMethod java/lang/Object ()V 4097 1 1495722 0 96 +ciMethod java/lang/Object hashCode ()I 4097 1 512 0 -1 +ciMethod java/lang/Object equals (Ljava/lang/Object;)Z 3073 1 39238 0 -1 +ciMethod java/lang/CharSequence length ()I 0 0 1 0 -1 +ciMethod java/lang/CharSequence charAt (I)C 0 0 1 0 -1 +ciMethod java/lang/CharSequence subSequence (II)Ljava/lang/CharSequence; 0 0 1 0 -1 +ciMethod java/lang/CharSequence toString ()Ljava/lang/String; 0 0 1 0 -1 +ciMethod java/lang/String ([C)V 2473 1 7932 0 0 +ciMethod java/lang/String length ()I 2137 1 420576 0 64 +ciMethod java/lang/String charAt (I)C 2081 1 688885 0 160 +ciMethod java/lang/String getChars (II[CI)V 449 1 92 0 0 +ciMethod java/lang/String equals (Ljava/lang/Object;)Z 2089 1 5394 0 448 +ciMethod java/lang/String hashCode ()I 3513 1 18060 0 512 +ciMethod java/lang/String substring (II)Ljava/lang/String; 2065 1 12354 0 1248 +ciMethod java/lang/String subSequence (II)Ljava/lang/CharSequence; 2249 1 20701 0 1184 +ciMethod java/lang/String toString ()Ljava/lang/String; 3153 1 3095 0 32 +ciMethod java/lang/String ([CIILjava/lang/Void;)V 4097 1 18904 0 0 +ciMethod java/lang/String ([BB)V 2353 1 122382 0 256 +ciMethod java/lang/String coder ()B 3481 1 582063 0 32 +ciMethod java/lang/String isLatin1 ()Z 4097 1 954747 0 64 +ciMethod java/lang/String checkIndex (II)V 1 1 7168 0 96 +ciMethod java/lang/String checkBoundsOffCount (III)V 2529 1 6492 0 -1 +ciMethod java/lang/String checkBoundsBeginEnd (III)V 2081 1 5388 0 128 +ciMethod java/lang/System arraycopy (Ljava/lang/Object;ILjava/lang/Object;II)V 3073 1 384 0 -1 +ciMethod java/util/Map get (Ljava/lang/Object;)Ljava/lang/Object; 0 0 1 0 -1 +ciMethod java/lang/reflect/Constructor newInstance ([Ljava/lang/Object;)Ljava/lang/Object; 2049 1 1661 0 -1 +ciMethod java/lang/StringBuilder getChars (II[CI)V 17 1 2 0 -1 +ciMethod java/nio/Buffer position ()I 1041 1 130 0 -1 +ciMethod java/lang/Boolean booleanValue ()Z 1065 1 133 0 -1 +ciMethod java/util/Objects checkIndex (II)I 3073 1 194128 0 -1 +ciMethod java/util/HashMap hash (Ljava/lang/Object;)I 4097 1 92215 0 192 +ciMethod java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 4097 1 26637 0 576 +ciMethod java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 3265 137 5542 0 512 +ciMethod java/lang/StringLatin1 charAt ([BI)C 2081 1 680577 0 128 +ciMethod java/lang/StringLatin1 getChars ([BII[CI)V 849 1 92 0 -1 +ciMethod java/lang/StringLatin1 equals ([B[B)Z 1977 1841 1871 0 -1 +ciMethod java/lang/StringLatin1 hashCode ([B)I 881 17401 971 0 448 +ciMethod java/lang/StringLatin1 newString ([BII)Ljava/lang/String; 1241 1 92554 0 0 +ciMethod java/lang/Math max (II)I 1337 1 73119 0 -1 +ciMethod java/lang/Math min (II)I 2113 1 91078 0 -1 +ciMethod java/util/Arrays copyOfRange ([BII)[B 2073 1 5485 0 576 +ciMethod java/lang/StringUTF16 getChar ([BI)C 4097 1 1367 0 -1 +ciMethod java/lang/StringUTF16 length ([B)I 9 1 5281 0 0 +ciMethod java/lang/StringUTF16 toBytes ([CII)[B 0 0 2 0 -1 +ciMethod java/lang/StringUTF16 compress ([CII)[B 4097 1 18880 0 0 +ciMethod java/lang/StringUTF16 compress ([BII)[B 41 1 5 0 -1 +ciMethod java/lang/StringUTF16 compress ([CI[BII)I 1025 27449 2579 0 -1 +ciMethod java/lang/StringUTF16 getChars ([BII[CI)V 33 4145 5 0 -1 +ciMethod java/lang/StringUTF16 equals ([B[B)Z 0 0 1 0 -1 +ciMethod java/lang/StringUTF16 hashCode ([B)I 1 1 1 0 0 +ciMethod java/lang/StringUTF16 newString ([BII)Ljava/lang/String; 0 0 5 0 0 +ciMethod java/lang/StringUTF16 charAt ([BI)C 1 1 5258 0 96 +ciMethod java/lang/StringUTF16 checkIndex (I[B)V 1 1 5264 0 0 +ciMethodData java/lang/Object ()V 2 1495722 orig 320 224 213 189 188 255 127 0 0 16 6 27 76 166 2 0 0 88 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 81 133 182 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 1 0 0 0 0 0 0 0 0 0 0 0 254 255 255 255 0 0 0 0 0 0 0 0 data 4 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethodData java/lang/StringLatin1 hashCode ([B)I 2 24830 orig 320 224 213 189 188 255 127 0 0 8 148 48 76 166 2 0 0 168 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 8 0 0 233 26 0 0 249 195 2 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 1 0 6 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 7 0 13 0 0 0 0 0 data 14 0xd0007 0x35d 0x38 0x587f 0x250003 0x587f 0xffffffffffffffe0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethodData java/lang/String isLatin1 ()Z 2 954747 orig 320 224 213 189 188 255 127 0 0 0 163 27 76 166 2 0 0 200 1 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 217 123 116 0 1 0 0 0 247 63 4 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 7 0 2 0 0 0 0 0 0 0 88 0 0 0 254 255 255 255 7 0 3 0 0 0 0 0 data 18 0x30007 0x0 0x58 0xe8f7b 0x80000006000a0007 0x6 0x38 0xe8f76 0xe0003 0xe8f76 0x18 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethodData java/lang/String hashCode ()I 2 18060 orig 320 224 213 189 188 255 127 0 0 208 107 27 76 166 2 0 0 80 2 0 0 120 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 183 1 0 0 169 38 2 0 1 0 0 0 57 40 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 1 0 19 0 2 0 0 0 0 0 0 0 208 0 0 0 254 255 255 255 7 0 6 0 0 0 0 0 data 35 0x60007 0x1cfe 0xd0 0x27d7 0x80000006000e0007 0x46 0xb0 0x2792 0x130005 0x2792 0x0 0x0 0x0 0x0 0x0 0x8000000600160007 0x1 0x48 0x2792 0x1d0002 0x2792 0x200003 0x2792 0x28 0x270002 0x1 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x4 oops 0 methods 0 +ciMethodData java/lang/StringUTF16 hashCode ([B)I 1 11 orig 320 224 213 189 188 255 127 0 0 160 235 55 76 166 2 0 0 200 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 72 0 0 0 254 255 255 255 7 0 11 0 0 0 0 0 data 18 0xb0007 0x1 0x48 0xb 0x140002 0xb 0x1c0003 0xb 0xffffffffffffffd0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethodData java/lang/String coder ()B 2 582063 orig 320 224 213 189 188 255 127 0 0 160 161 27 76 166 2 0 0 168 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 179 1 0 0 225 255 70 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 5 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 7 0 3 0 0 0 0 0 data 14 0x30007 0x0 0x38 0x8dffc 0xa0003 0x8dffc 0x18 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethodData java/lang/String equals (Ljava/lang/Object;)Z 2 5394 orig 320 224 213 189 188 255 127 0 0 16 94 27 76 166 2 0 0 88 3 0 0 168 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 1 0 0 105 160 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 24 0 2 0 0 0 0 0 0 0 208 1 0 0 254 255 255 255 7 0 2 0 0 0 0 0 data 68 0x20007 0x102c 0x20 0x3e1 0x80104 0x0 0x0 0x2a64cb502a0 0x1027 0x0 0x0 0xb0007 0x5 0x178 0x1027 0xf0004 0x0 0x0 0x2a64cb502a0 0x1027 0x0 0x0 0x140005 0x1027 0x0 0x0 0x0 0x0 0x0 0x180005 0x1027 0x0 0x0 0x0 0x0 0x0 0x1b0007 0x0 0xb0 0x1027 0x1f0005 0x1027 0x0 0x0 0x0 0x0 0x0 0x220007 0x0 0x48 0x1027 0x2d0002 0x1027 0x300003 0x1027 0x28 0x3b0002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 2 7 java/lang/String 18 java/lang/String methods 0 +ciMethod java/util/ArrayList size ()I 1025 1 128 0 0 +ciMethod java/util/ArrayList elementData (I)Ljava/lang/Object; 3073 1 177792 0 0 +ciMethod java/util/ArrayList get (I)Ljava/lang/Object; 3073 1 175901 0 192 +ciMethodData java/lang/String charAt (I)C 2 688885 orig 320 224 213 189 188 255 127 0 0 184 84 27 76 166 2 0 0 0 2 0 0 88 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 0 0 137 15 84 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 16 0 2 0 0 0 0 0 0 0 120 0 0 0 254 255 255 255 5 0 1 0 0 0 0 0 data 25 0x10005 0xa81f1 0x0 0x0 0x0 0x0 0x0 0x40007 0x1 0x30 0xa81f0 0xc0002 0xa81f0 0x150002 0x1 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethodData java/lang/StringLatin1 charAt ([BI)C 2 680577 orig 320 224 213 189 188 255 127 0 0 248 130 48 76 166 2 0 0 200 1 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 0 0 233 11 83 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 8 0 2 0 0 0 0 0 0 0 80 0 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 18 0x10007 0x0 0x40 0xa617d 0x70007 0xa617d 0x30 0x0 0xf0002 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethodData java/lang/StringUTF16 charAt ([BI)C 2 5258 orig 320 224 213 189 188 255 127 0 0 0 33 56 76 166 2 0 0 168 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 81 164 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 32 0 0 0 254 255 255 255 2 0 2 0 0 0 0 0 data 14 0x20002 0x148a 0x70002 0x2a6 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethodData java/lang/StringUTF16 checkIndex (I[B)V 2 5264 orig 320 224 213 189 188 255 127 0 0 184 43 56 76 166 2 0 0 168 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 129 164 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 32 0 0 0 254 255 255 255 2 0 2 0 0 0 0 0 data 14 0x20002 0x1490 0x50002 0x1490 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethodData java/lang/StringUTF16 length ([B)I 2 5281 orig 320 224 213 189 188 255 127 0 0 192 208 55 76 166 2 0 0 104 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 165 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 1 0 0 0 0 0 0 0 0 0 0 0 254 255 255 255 0 0 0 0 0 0 0 0 data 6 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethodData java/lang/String checkIndex (II)V 2 7168 orig 320 224 213 189 188 255 127 0 0 232 163 27 76 166 2 0 0 0 3 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 224 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 17 0 2 0 0 0 0 0 0 0 120 1 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 57 0x10007 0x0 0x40 0x1c00 0x60007 0x1c00 0x158 0x0 0x110002 0x0 0x160005 0x0 0x0 0x0 0x0 0x0 0x0 0x1a0005 0x0 0x0 0x0 0x0 0x0 0x0 0x1f0005 0x0 0x0 0x0 0x0 0x0 0x0 0x230005 0x0 0x0 0x0 0x0 0x0 0x0 0x260005 0x0 0x0 0x0 0x0 0x0 0x0 0x290002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethod java/util/HashMap$TreeNode getTreeNode (ILjava/lang/Object;)Ljava/util/HashMap$TreeNode; 0 0 1 0 -1 +ciMethodData java/lang/String length ()I 2 420576 orig 320 224 213 189 188 255 127 0 0 48 83 27 76 166 2 0 0 184 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 1 0 0 169 78 51 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 6 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 6 0 0 0 0 0 data 16 0x60005 0x669d5 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethod jdk/internal/util/Preconditions checkIndex (IILjava/util/function/BiFunction;)I 3073 1 194131 0 -1 +ciMethodData java/util/HashMap hash (Ljava/lang/Object;)I 2 92215 orig 320 224 213 189 188 255 127 0 0 144 113 45 76 166 2 0 0 240 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 185 49 11 0 1 0 0 0 31 96 1 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 6 0 2 0 0 0 0 0 0 0 112 0 0 0 254 255 255 255 7 0 1 0 6 0 0 128 data 23 0x8000000600010007 0x16637 0x38 0x2 0x50003 0x2 0x50 0x90005 0x11c46 0x0 0x2a64cb502a0 0x484e 0x2a64cb51720 0x1a3 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0xffffffffffffffff oops 2 10 java/lang/String 12 java/lang/Module methods 0 +ciMethodData java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 2 5542 orig 320 224 213 189 188 255 127 0 0 144 125 45 76 166 2 0 0 104 4 0 0 200 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 150 1 0 0 113 160 0 0 161 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 1 0 37 0 2 0 0 0 0 0 0 0 216 2 0 0 254 255 255 255 7 0 6 0 0 0 0 0 data 102 0x60007 0x461 0x2d8 0xfad 0xe0007 0x0 0x2b8 0xfad 0x1c0007 0x628 0x298 0x985 0x250007 0x1f3 0xb8 0x792 0x310007 0x42c 0x98 0x366 0x350007 0x0 0x78 0x366 0x3b0005 0x2b9 0x0 0x2a64cb502a0 0xab 0x2a6513dd3e0 0x2 0x3e0007 0x3f 0x20 0x327 0x4c0007 0xac 0x1c0 0x186 0x510004 0xfffffffffffffe7a 0x0 0x2a64cfc7050 0xe 0x0 0x0 0x540007 0x186 0x90 0x0 0x590004 0x0 0x0 0x0 0x0 0x0 0x0 0x5e0005 0x0 0x0 0x0 0x0 0x0 0x0 0x680007 0xa5 0xb8 0x115 0x740007 0x80 0x98 0x95 0x780007 0x0 0x78 0x95 0x7e0005 0x14 0x0 0x2a64cb502a0 0x22 0x2a6513dd490 0x5f 0x810007 0x1 0x20 0x94 0x8f0007 0x34 0xffffffffffffff48 0x72 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0xffffffffffffffff oops 5 27 java/lang/String 29 java/util/zip/ZipFile$Source$Key 42 java/util/HashMap$Node 79 java/lang/String 81 java/lang/reflect/ProxyGenerator$ConstantPool$IndirectEntry methods 0 +ciMethodData java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 2 26637 orig 320 224 213 189 188 255 127 0 0 232 123 45 76 166 2 0 0 8 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 105 48 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 10 0 2 0 0 0 0 0 0 0 128 0 0 0 254 255 255 255 2 0 2 0 0 0 0 0 data 26 0x20002 0x660d 0x60005 0x660d 0x0 0x0 0x0 0x0 0x0 0xb0007 0x2b2a 0x38 0x3ae3 0xf0003 0x3ae3 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethodData java/lang/String ([BB)V 2 122382 orig 320 224 213 189 188 255 127 0 0 232 160 27 76 166 2 0 0 144 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 1 0 0 65 231 14 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 16 0 0 0 254 255 255 255 2 0 1 0 0 0 0 0 data 11 0x10002 0x1dce8 0x0 0x0 0x0 0x0 0x9 0x3 0xe 0x0 0x0 oops 0 methods 0 +ciMethodData java/util/Arrays copyOfRange ([BII)[B 2 5485 orig 320 224 213 189 188 255 127 0 0 64 106 54 76 166 2 0 0 208 2 0 0 16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 0 0 81 163 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 18 0 2 0 0 0 0 0 0 0 64 1 0 0 254 255 255 255 7 0 5 0 0 0 0 0 data 51 0x50007 0x146a 0x120 0x0 0x100002 0x0 0x140005 0x0 0x0 0x0 0x0 0x0 0x0 0x190005 0x0 0x0 0x0 0x0 0x0 0x0 0x1d0005 0x0 0x0 0x0 0x0 0x0 0x0 0x200005 0x0 0x0 0x0 0x0 0x0 0x0 0x230002 0x0 0x360002 0x146a 0x390002 0x146a 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0xffffffffffffffff 0x0 0x0 oops 0 methods 0 +ciMethodData java/lang/StringLatin1 newString ([BII)Ljava/lang/String; 2 92554 orig 320 224 213 189 188 255 127 0 0 184 178 48 76 166 2 0 0 176 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 121 71 11 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 32 0 0 0 254 255 255 255 2 0 9 0 0 0 0 0 data 15 0x90002 0x168ef 0xd0002 0x168ef 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0xffffffffffffffff 0x0 0x0 oops 0 methods 0 +ciMethodData java/lang/StringUTF16 newString ([BII)Ljava/lang/String; 1 5 orig 320 224 213 189 188 255 127 0 0 208 19 56 76 166 2 0 0 16 2 0 0 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 254 255 255 255 7 0 3 0 0 0 0 0 data 27 0x30007 0x0 0x60 0x5 0x90002 0x5 0xe0007 0x0 0x30 0x5 0x170002 0x5 0x2a0002 0x0 0x2e0002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0xffffffffffffffff 0x0 0x0 oops 0 methods 0 +ciMethod java/lang/AssertionError (Ljava/lang/Object;)V 0 0 1 0 -1 +ciMethodData java/lang/String checkBoundsBeginEnd (III)V 2 5388 orig 320 224 213 189 188 255 127 0 0 208 166 27 76 166 2 0 0 152 3 0 0 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 0 0 65 160 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 19 0 2 0 0 0 0 0 0 0 8 2 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 76 0x10007 0x0 0x60 0x1408 0x60007 0x0 0x40 0x1408 0xb0007 0x1408 0x1c8 0x0 0x160002 0x0 0x1b0005 0x0 0x0 0x0 0x0 0x0 0x0 0x1f0005 0x0 0x0 0x0 0x0 0x0 0x0 0x240005 0x0 0x0 0x0 0x0 0x0 0x0 0x280005 0x0 0x0 0x0 0x0 0x0 0x0 0x2d0005 0x0 0x0 0x0 0x0 0x0 0x0 0x310005 0x0 0x0 0x0 0x0 0x0 0x0 0x340005 0x0 0x0 0x0 0x0 0x0 0x0 0x370002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 0 methods 0 +ciMethodData java/lang/String substring (II)Ljava/lang/String; 2 12354 orig 320 224 213 189 188 255 127 0 0 136 119 27 76 166 2 0 0 168 2 0 0 192 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 1 0 0 1 122 1 0 1 0 0 0 79 20 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 20 0 2 0 0 0 0 0 0 0 24 1 0 0 254 255 255 255 5 0 1 0 0 0 0 0 data 46 0x10005 0x2f40 0x0 0x0 0x0 0x0 0x0 0x80002 0x2f40 0x110007 0xa83 0x40 0x24bd 0x160007 0x21fc 0x20 0x2c1 0x1c0005 0x2c7f 0x0 0x0 0x0 0x0 0x0 0x80000006001f0007 0x5 0x48 0x2c7b 0x290002 0x2c7b 0x2c0003 0x2c7b 0x28 0x360002 0x5 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 0 methods 0 +ciMethodData java/util/ArrayList get (I)Ljava/lang/Object; 2 175901 orig 320 224 213 189 188 255 127 0 0 24 118 64 76 166 2 0 0 208 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 233 108 21 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 10 0 2 0 0 0 0 0 0 0 72 0 0 0 254 255 255 255 2 0 5 0 0 0 0 0 data 19 0x50002 0x2ad9d 0xb0005 0x10d89 0x0 0x2a651487740 0x2a7d 0x2a64e85a180 0x17597 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 2 5 java/util/ArrayList 7 org/jetbrains/kotlin/com/intellij/util/containers/Stack methods 0 +ciMethodData java/util/Objects checkIndex (II)I 2 194128 orig 320 224 213 189 188 255 127 0 0 56 244 44 76 166 2 0 0 152 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 129 166 23 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 9 0 2 0 0 0 0 0 0 0 16 0 0 0 254 255 255 255 2 0 3 0 0 0 0 0 data 12 0x30002 0x2f4d0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethodData java/util/ArrayList elementData (I)Ljava/lang/Object; 2 177792 orig 320 224 213 189 188 255 127 0 0 152 116 64 76 166 2 0 0 120 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 1 168 21 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 1 0 0 0 0 0 0 0 0 0 0 0 254 255 255 255 0 0 0 0 0 0 0 0 data 8 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethod java/nio/CharBuffer get ([CII)Ljava/nio/CharBuffer; 0 0 1 0 -1 +ciMethod java/nio/CharBuffer position (I)Ljava/nio/Buffer; 873 1 154 0 -1 +ciMethodData java/lang/String toString ()Ljava/lang/String; 2 3095 orig 320 224 213 189 188 255 127 0 0 80 142 27 76 166 2 0 0 96 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 1 0 0 105 84 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 1 0 0 0 0 0 0 0 0 0 0 0 254 255 255 255 0 0 0 0 0 0 0 0 data 5 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethod org/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger error (Ljava/lang/String;)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/CharSequenceBackedByArray getChars ([CI)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/psi/tree/IElementType getIndex ()S 1025 1 128 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/SyntaxTreeBuilder advanceLexer ()V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/SyntaxTreeBuilder getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/SyntaxTreeBuilder remapCurrentToken (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/SyntaxTreeBuilder rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/SyntaxTreeBuilder getTokenText ()Ljava/lang/String; 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/PsiBuilder mark ()Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/psi/tree/IElementType$Predicate matches (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)Z 0 0 1 0 -1 +ciMethodData java/lang/String ([CIILjava/lang/Void;)V 2 18904 orig 320 224 213 189 188 255 127 0 0 200 158 27 76 166 2 0 0 48 2 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 193 62 2 0 1 0 0 0 178 40 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 1 0 15 0 2 0 0 0 0 0 0 0 144 0 0 0 254 255 255 255 2 0 1 0 0 0 0 0 data 31 0x10002 0x47d8 0x8000000600050007 0x47b1 0x20 0x28 0x1e0007 0x0 0x50 0x47b1 0x240002 0x47b1 0x2b0007 0x2 0x20 0x47af 0x430002 0x2 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0xe 0x0 0x0 0x0 0x0 oops 0 methods 0 +ciMethodData java/lang/StringUTF16 compress ([CII)[B 2 18880 orig 320 224 213 189 188 255 127 0 0 120 217 55 76 166 2 0 0 192 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 62 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 5 0 2 0 0 0 0 0 0 0 48 0 0 0 254 255 255 255 2 0 9 0 0 0 0 0 data 17 0x90002 0x47c0 0xd0007 0x2 0x20 0x47be 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 0 methods 0 +ciMethodData java/lang/String ([C)V 2 7932 orig 320 224 213 189 188 255 127 0 0 8 70 27 76 166 2 0 0 128 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 1 0 0 57 238 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 16 0 0 0 254 255 255 255 2 0 6 0 0 0 0 0 data 9 0x60002 0x1dc7 0x0 0x0 0x0 0x9 0x2 0xe 0x0 oops 0 methods 0 +ciMethod org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet get (I)Z 4097 1 10650 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet contains (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)Z 2449 1 21974 0 256 +ciMethod org/jetbrains/kotlin/lexer/KtKeywordToken isSoft ()Z 393 1 49 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil getChars (Ljava/lang/CharSequence;[CIII)V 4521 1417 5792 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil fromSequence (Ljava/lang/CharSequence;II)[C 4097 1 4695 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil $$$reportNull$$$0 (I)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/CharArrayExternalizable getChars (II[CI)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/ImmutableText length ()I 4097 1 16793 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/ImmutableText subSequence (II)Ljava/lang/CharSequence; 4097 1 5529 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/ImmutableText getChars (II[CI)V 4097 1 5736 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/ImmutableText $$$reportNull$$$0 (I)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Node getChars (II[CI)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Node length ()I 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode length ()I 129 1 3819 0 64 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode getChars (II[CI)V 65 555521 1136 0 832 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode byteToChar (B)C 4097 1 88431 0 64 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode $$$reportNull$$$0 (I)V 0 0 1 0 -1 +ciMethodData org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode byteToChar (B)C 2 88431 orig 320 224 213 189 188 255 127 0 0 72 175 228 80 166 2 0 0 88 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 121 187 10 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 1 0 0 0 0 0 0 0 0 0 0 0 254 255 255 255 0 0 0 0 0 0 0 0 data 4 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/StringFactory createShared ([C)Ljava/lang/String; 4097 1 6510 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/StringFactory $$$reportNull$$$0 (I)V 0 0 1 0 -1 +ciMethodData org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode getChars (II[CI)V 2 145605 orig 320 224 213 189 188 255 127 0 0 120 172 228 80 166 2 0 0 192 2 0 0 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 226 14 1 0 65 35 0 0 41 76 9 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 1 0 16 0 2 0 0 0 0 0 0 0 32 1 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 49 0x10007 0x468 0x30 0x0 0x50002 0x0 0x90007 0x0 0x98 0x468 0xe0005 0x0 0x0 0x2a651aa7000 0x468 0x0 0x0 0x110007 0x0 0x40 0x468 0x160007 0x468 0x30 0x0 0x1d0002 0x0 0x270007 0x465 0x48 0x11e11 0x370002 0x11e11 0x3e0003 0x11e11 0xffffffffffffffd0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0x0 0x0 0x0 0x0 0x0 oops 1 13 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode length ()I 2 3819 orig 320 224 213 189 188 255 127 0 0 80 171 228 80 166 2 0 0 112 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 217 118 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 1 0 0 0 0 0 0 0 0 0 0 0 254 255 255 255 0 0 0 0 0 0 0 0 data 7 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl precede (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker;)Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 2721 1 2279 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2929 1 33370 0 2752 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl calcTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 713 1 8025 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4097 1 9928 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl skipWhitespace ()V 1233 161 9024 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl getTokenText ()Ljava/lang/String; 3073 1 7885 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl createMarker (I)Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker; 4097 1 19913 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl eof ()Z 47113 1 54777 0 3136 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl access$200 (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl;)Lorg/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction; 1353 1 169 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl access$600 (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl;Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker;)Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 2721 1 1441 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl access$800 ()Lorg/jetbrains/kotlin/com/intellij/openapi/diagnostic/Logger; 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl access$900 (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl;Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker;Ljava/lang/String;Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker;)V 4097 1 13867 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl $$$reportNull$$$0 (I)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$ProductionMarker getLexemeIndex (Z)I 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/SyntaxTreeBuilder$Marker drop ()V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/SyntaxTreeBuilder$Marker done (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker precede ()Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker precede ()Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 2721 1 1441 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker drop ()V 4097 1 25646 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker done (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)V 4097 1 13837 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker isDone ()Z 4097 1 39461 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker $$$reportNull$$$0 (I)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/util/containers/Stack peek ()Ljava/lang/Object; 2889 1 96000 0 224 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/MarkerPool allocateStartMarker ()Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker; 4097 1 19913 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/MarkerPool freeMarker (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$ProductionMarker;)V 4097 1 29382 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/MarkerOptionalData notifyAllocated (I)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction addBefore (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$ProductionMarker;Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$ProductionMarker;)V 3129 1 2279 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction indexOf (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$ProductionMarker;)I 4097 1 26063 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction findLinearly (I)I 4097 14833 10283 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction findMarkerAtLexeme (I)I 105 1 1687 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction dropMarker (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker;)V 4097 1 19371 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction assertNoDoneMarkerAround (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker;)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction $$$reportNull$$$0 (I)V 0 0 1 0 -1 +ciMethod gnu/trove/TIntArrayList size ()I 1409 1 176 0 -1 +ciMethod gnu/trove/TIntArrayList insert (II)V 4097 1 16213 0 -1 +ciMethod gnu/trove/TIntArrayList remove (I)I 4097 1 19371 0 -1 +ciMethod gnu/trove/TIntArrayList indexOf (II)I 105 65 1687 0 -1 +ciMethod gnu/trove/TIntArrayList lastIndexOf (I)I 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilder newlineBeforeCurrentToken ()Z 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl newlineBeforeCurrentToken ()Z 609 177 14046 0 2624 +ciMethod org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl joinComplexTokens ()Z 2641 1 82421 0 288 +ciMethod org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 3585 1 57752 0 1056 +ciMethod org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getJoinedTokenType (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 3169 1 33729 0 544 +ciMethod org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenText ()Ljava/lang/String; 3073 1 7086 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getOriginalText ()Ljava/lang/CharSequence; 4097 1 5547 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 3585 1 64387 0 96 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter remapCurrentToken (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)V 2137 1 395 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 313 1 9509 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawTokenTypeStart (I)I 4097 1 11094 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenText ()Ljava/lang/String; 3065 1 7600 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getCurrentOffset ()I 4097 1 15624 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter mark ()Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 4097 1 18751 0 2336 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter eof ()Z 4097 1 13004 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter $$$reportNull$$$0 (I)V 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/parsing/AbstractKotlinParsing mark ()Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 4097 1 41044 0 96 +ciMethod org/jetbrains/kotlin/parsing/AbstractKotlinParsing eof ()Z 1201 1 15175 0 -1 +ciMethod org/jetbrains/kotlin/parsing/AbstractKotlinParsing advance ()V 4097 1 20979 0 12896 +ciMethod org/jetbrains/kotlin/parsing/AbstractKotlinParsing tt ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2465 1 135825 0 96 +ciMethod org/jetbrains/kotlin/parsing/AbstractKotlinParsing _atSet (Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet;)Z 4097 1 22777 0 2080 +ciMethod org/jetbrains/kotlin/parsing/AbstractKotlinParsing atSet (Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet;)Z 4097 1 22777 0 0 +ciMethod org/jetbrains/kotlin/parsing/KotlinExpressionParsing parseBinaryExpression (Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence;)V 4097 1 16903 0 0 +ciMethod org/jetbrains/kotlin/parsing/KotlinExpressionParsing parseOperationReference ()V 0 0 404 0 0 +ciMethod org/jetbrains/kotlin/parsing/KotlinExpressionParsing interruptedWithNewLine ()Z 4097 1 18110 0 0 +ciMethod org/jetbrains/kotlin/parsing/KotlinExpressionParsing access$300 (Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing;Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence;)V 4097 1 15865 0 0 +ciMethod org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence parseHigherPrecedence (Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing;)V 4097 1 15703 0 0 +ciMethod org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence parseRightHandSide (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing;)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 3953 1 403 0 0 +ciMethod org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence getOperations ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; 1081 1 12516 0 0 +ciMethod org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence $$$reportNull$$$0 (I)V 0 0 1 0 -1 +ciMethodData org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet get (I)Z 2 10650 orig 320 224 213 189 188 255 127 0 0 104 159 156 79 166 2 0 0 240 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 209 60 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 11 0 2 0 0 0 0 0 0 0 120 0 0 0 254 255 255 255 7 0 11 0 0 0 0 0 data 23 0xb0007 0x101 0x78 0x2699 0x140007 0x0 0x58 0x2699 0x230007 0x1a61 0x38 0xc38 0x270003 0xc38 0x18 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethod org/jetbrains/kotlin/com/intellij/lang/TokenWrapper getValue ()Ljava/lang/String; 0 0 1 0 -1 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence (Ljava/lang/CharSequence;II)V 4097 1 5529 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence toString ()Ljava/lang/String; 4097 1 4695 0 0 +ciMethod org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence $$$reportNull$$$0 (I)V 0 0 1 0 -1 +ciMethodData org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet contains (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)Z 2 21974 orig 320 224 213 189 188 255 127 0 0 120 160 156 79 166 2 0 0 224 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 1 0 0 33 165 2 0 1 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 16 0 2 0 0 0 0 0 0 0 88 1 0 0 254 255 255 255 7 0 1 0 6 0 0 128 data 53 0x8000000600010007 0x54a3 0x20 0x2 0x70005 0x54a3 0x0 0x0 0x0 0x0 0x0 0xd0007 0x0 0x70 0x54a3 0x150007 0x2f06 0x50 0x259d 0x1a0002 0x259d 0x1d0007 0xbcf 0x98 0x19ce 0x240007 0x48d4 0x90 0x0 0x2c0005 0x0 0x0 0x0 0x0 0x0 0x0 0x310007 0x0 0x38 0x0 0x350003 0xbcf 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0xffffffffffffffff oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/util/containers/Stack peek ()Ljava/lang/Object; 2 96000 orig 320 224 213 189 188 255 127 0 0 168 65 81 83 166 2 0 0 32 2 0 0 88 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 105 1 0 0 185 172 11 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 13 0 2 0 0 0 0 0 0 0 160 0 0 0 254 255 255 255 5 0 1 0 0 0 0 0 data 29 0x10005 0x0 0x0 0x2a64e85a180 0x17597 0x0 0x0 0x60007 0x17597 0x30 0x0 0xd0002 0x0 0x150005 0x0 0x0 0x2a64e85a180 0x17597 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 2 3 org/jetbrains/kotlin/com/intellij/util/containers/Stack 16 org/jetbrains/kotlin/com/intellij/util/containers/Stack methods 0 +ciMethodData org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl joinComplexTokens ()Z 2 82421 orig 320 224 213 189 188 255 127 0 0 216 60 83 83 166 2 0 0 40 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 74 1 0 0 89 5 10 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 14 0 2 0 0 0 0 0 0 0 168 0 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 30 0x40005 0x0 0x0 0x2a64e85a180 0x140ab 0x0 0x0 0x70004 0x0 0x0 0x2a64cb53920 0x140ab 0x0 0x0 0xa0005 0x140ab 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 2 3 org/jetbrains/kotlin/com/intellij/util/containers/Stack 10 java/lang/Boolean methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2 33519 orig 320 224 213 189 188 255 127 0 0 152 172 79 83 166 2 0 0 176 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 110 1 0 0 9 12 4 0 1 0 0 0 215 73 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 12 0 2 0 0 0 0 0 0 0 48 0 0 0 254 255 255 255 7 0 6 0 0 0 0 0 data 15 0x60007 0x6281 0x30 0x1f00 0xb0002 0x1f00 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0xffffffffffffffff oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl eof ()Z 2 54933 orig 320 224 213 189 188 255 127 0 0 224 190 79 83 166 2 0 0 216 1 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 254 0 0 0 161 252 5 0 1 0 0 0 230 135 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 6 0 2 0 0 0 0 0 0 0 104 0 0 0 254 255 255 255 7 0 4 0 0 0 0 0 data 20 0x40007 0xa7f4 0x30 0x17a0 0xd0002 0x17a0 0x180007 0xbf90 0x38 0x6 0x1c0003 0x6 0x18 0x0 0x0 0x0 0x0 0x9 0x1 0xffffffffffffffff oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getJoinedTokenType (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2 33729 orig 320 224 213 189 188 255 127 0 0 224 64 83 83 166 2 0 0 184 2 0 0 120 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 1 0 0 169 17 4 0 1 0 0 0 10 56 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 14 0 2 0 0 0 0 0 0 0 40 1 0 0 254 255 255 255 7 0 4 0 0 0 0 0 data 48 0x40007 0x808f 0xb0 0x1a6 0x90005 0x0 0x0 0x2a64e853290 0x1a6 0x0 0x0 0x110007 0x11c 0x20 0x8a 0x80000006001c0007 0x10f 0x20 0xf 0x230003 0x10f 0x90 0x2a0007 0x800c 0x78 0x83 0x2f0005 0x0 0x0 0x2a64e853290 0x83 0x0 0x0 0x370007 0x24 0x20 0x5f 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 2 7 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl 29 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2 9509 orig 320 224 213 189 188 255 127 0 0 88 87 83 83 166 2 0 0 192 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 0 0 0 241 39 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 5 0 0 0 0 0 data 17 0x50005 0x0 0x0 0x2a65148dc90 0x24fe 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 1 3 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2 57752 orig 320 224 213 189 188 255 127 0 0 168 63 83 83 166 2 0 0 208 1 0 0 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 192 1 0 0 193 254 6 0 1 0 0 0 32 121 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 17 0 2 0 0 0 0 0 0 0 96 0 0 0 254 255 255 255 2 0 1 0 0 0 0 0 data 19 0x10002 0xdfd8 0x40007 0xd876 0x30 0x762 0x80002 0x762 0xe0002 0xd876 0x120002 0xd876 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2 64387 orig 320 224 213 189 188 255 127 0 0 152 83 83 83 166 2 0 0 184 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 192 1 0 0 25 206 7 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 16 0x40005 0x0 0x0 0x2a65148dc90 0xf9c3 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 1 3 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/parsing/AbstractKotlinParsing tt ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2 135825 orig 320 224 213 189 188 255 127 0 0 72 93 84 83 166 2 0 0 184 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 52 1 0 0 233 138 16 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 16 0x40005 0x0 0x0 0x2a64e853290 0x2115d 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 1 3 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/parsing/AbstractKotlinParsing eof ()Z 2 15222 orig 320 224 213 189 188 255 127 0 0 8 90 84 83 166 2 0 0 184 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 150 0 0 0 1 215 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 16 0x40005 0x0 0x0 0x2a64e853290 0x3ae0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 1 3 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl newlineBeforeCurrentToken ()Z 2 14046 orig 320 224 213 189 188 255 127 0 0 160 57 83 83 166 2 0 0 104 6 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 76 0 0 0 145 180 1 0 193 82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 2 0 44 0 2 0 0 0 0 0 0 0 224 4 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 166 0x40005 0x0 0x0 0x2a64e85a180 0x3692 0x0 0x0 0x70004 0x0 0x0 0x2a64cb53920 0x3692 0x0 0x0 0xa0005 0x3692 0x0 0x0 0x0 0x0 0x0 0xd0007 0x17be 0x20 0x1ed4 0x130005 0x0 0x0 0x2a64e853290 0x17be 0x0 0x0 0x160007 0x17be 0x20 0x0 0x1f0005 0x0 0x0 0x2a64e853290 0x1cea 0x0 0x0 0x220007 0x0 0x388 0x1cea 0x280005 0x0 0x0 0x2a64e853290 0x1cea 0x0 0x0 0x300007 0x0 0x318 0x1cea 0x370007 0x0 0x2f8 0x1cea 0x3e0007 0x0 0x2d8 0x1cea 0x450007 0x1cea 0x38 0x0 0x480003 0x0 0x298 0x4f0007 0x1584 0x38 0x766 0x520003 0x766 0x278 0x580005 0x0 0x0 0x2a64e853290 0x1584 0x0 0x0 0x610005 0x0 0x0 0x2a64e853290 0x1584 0x0 0x0 0x690007 0x1584 0x50 0x0 0x6d0007 0x0 0x30 0x0 0x740002 0x0 0x7b0007 0x1584 0xc0 0x0 0x810005 0x0 0x0 0x0 0x0 0x0 0x0 0x840005 0x0 0x0 0x0 0x0 0x0 0x0 0x890007 0x0 0x30 0x0 0x900002 0x0 0x9b0007 0x52c 0xc8 0x1584 0x9f0005 0x0 0x0 0x2a64e853290 0x1584 0x0 0x0 0xa40005 0x0 0x0 0x2a651e076c0 0x4e3 0x2a64cb502a0 0x10a1 0xab0007 0x52c 0x20 0x1058 0xb30003 0x52c 0xffffffffffffff50 0xb90003 0x52c 0xfffffffffffffc58 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 10 3 org/jetbrains/kotlin/com/intellij/util/containers/Stack 10 java/lang/Boolean 28 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl 39 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl 50 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl 83 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl 90 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl 135 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl 142 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText 144 java/lang/String methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker isDone ()Z 2 39462 orig 320 224 213 189 188 255 127 0 0 168 119 80 83 166 2 0 0 160 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 49 193 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 6 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 7 0 5 0 0 0 0 0 data 13 0x50007 0x80bf 0x38 0x1767 0x90003 0x1767 0x18 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethodData java/lang/String getChars (II[CI)V 1 92 orig 320 224 213 189 188 255 127 0 0 128 89 27 76 166 2 0 0 136 2 0 0 192 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 56 0 0 0 33 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 232 0 0 0 254 255 255 255 5 0 3 0 0 0 0 0 data 42 0x30005 0x24 0x0 0x0 0x0 0x0 0x0 0x60002 0x24 0x100002 0x24 0x140005 0x24 0x0 0x0 0x0 0x0 0x0 0x170007 0x0 0x48 0x24 0x230002 0x24 0x260003 0x24 0x28 0x320002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0x0 0x0 0x0 0xffffffffffffffff 0x0 oops 0 methods 0 +ciMethodData java/lang/String subSequence (II)Ljava/lang/CharSequence; 2 20701 orig 320 224 213 189 188 255 127 0 0 80 120 27 76 166 2 0 0 200 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 1 0 0 33 126 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 3 0 0 0 0 0 data 18 0x30005 0x4fc4 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl createMarker (I)Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker; 2 19913 orig 320 224 213 189 188 255 127 0 0 248 189 79 83 166 2 0 0 72 2 0 0 88 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 73 94 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 9 0 2 0 0 0 0 0 0 0 192 0 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 34 0x40005 0x4bc9 0x0 0x0 0x0 0x0 0x0 0x110007 0x4bc9 0x58 0x0 0x1c0005 0x0 0x0 0x0 0x0 0x0 0x0 0x210007 0x4bc9 0x30 0x0 0x260002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter mark ()Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 2 18751 orig 320 224 213 189 188 255 127 0 0 224 90 83 83 166 2 0 0 232 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 249 57 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 6 0 2 0 0 0 0 0 0 0 104 0 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 22 0x40005 0x0 0x0 0x2a65148dc90 0x473f 0x0 0x0 0xa0007 0x473f 0x30 0x0 0xe0002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 1 3 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/parsing/AbstractKotlinParsing mark ()Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 2 41044 orig 320 224 213 189 188 255 127 0 0 176 83 84 83 166 2 0 0 184 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 161 242 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 16 0x40005 0x0 0x0 0x2a64e853290 0x9e54 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 1 3 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/parsing/AbstractKotlinParsing advance ()V 2 21032 orig 320 224 213 189 188 255 127 0 0 184 90 84 83 166 2 0 0 184 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 65 129 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 16 0x40005 0x0 0x0 0x2a64e853290 0x5028 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 1 3 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/util/text/ImmutableText length ()I 2 16793 orig 320 224 213 189 188 255 127 0 0 168 128 178 79 166 2 0 0 184 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 201 252 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 16 0x40005 0x0 0x0 0x2a651aa7000 0x3f99 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 1 3 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction indexOf (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$ProductionMarker;)I 2 26063 orig 320 224 213 189 188 255 127 0 0 0 12 82 83 166 2 0 0 144 2 0 0 120 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 121 30 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 2 0 25 0 2 0 0 0 0 0 0 0 8 1 0 0 254 255 255 255 2 0 5 0 0 0 0 0 data 43 0x50002 0x63cf 0xa0007 0x5d45 0xa0 0x68a 0x110005 0x0 0x0 0x2a65167c570 0x68a 0x0 0x0 0x140002 0x68a 0x1b0005 0x0 0x0 0x2a64e2f3ee0 0x68a 0x0 0x0 0x200007 0x63cf 0x58 0x0 0x280005 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0xffffffffffffffff 0xffffffffffffffff oops 2 9 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker 18 org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction findLinearly (I)I 2 53439 orig 320 224 213 189 188 255 127 0 0 24 13 82 83 166 2 0 0 96 2 0 0 72 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 62 7 0 0 89 49 1 0 9 76 6 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 1 0 12 0 2 0 0 0 0 0 0 0 216 0 0 0 254 255 255 255 5 0 2 0 0 0 0 0 data 37 0x20005 0x0 0x0 0x2a64e2f3ee0 0x262b 0x0 0x0 0x80002 0x262b 0xd0005 0x0 0x0 0x2a64e2f3ee0 0x262b 0x0 0x0 0x150007 0x55 0x58 0xef55 0x1f0007 0xc97f 0x20 0x25d6 0x270003 0xc97f 0xffffffffffffffc0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0xffffffffffffffff 0x0 oops 2 3 org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction 12 org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker done (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)V 2 13923 orig 320 224 213 189 188 255 127 0 0 128 109 80 83 166 2 0 0 64 2 0 0 112 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 17 163 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 9 0 2 0 0 0 0 0 0 0 184 0 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 33 0x10007 0x3462 0x30 0x0 0x50002 0x0 0xc0007 0x3462 0x78 0x0 0xf0002 0x0 0x180002 0x0 0x1b0005 0x0 0x0 0x0 0x0 0x0 0x0 0x2a0002 0x3462 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0xffffffffffffffff 0x0 oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2 9928 orig 320 224 213 189 188 255 127 0 0 176 179 79 83 166 2 0 0 208 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 65 38 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 9 0 2 0 0 0 0 0 0 0 88 0 0 0 254 255 255 255 7 0 12 0 0 0 0 0 data 19 0xc0007 0x0 0x58 0x24c8 0x100007 0x0 0x38 0x24c8 0x190003 0x24c8 0x18 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/util/text/StringFactory createShared ([C)Ljava/lang/String; 2 6510 orig 320 224 213 189 188 255 127 0 0 32 30 230 80 166 2 0 0 0 3 0 0 80 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 113 187 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 7 0 2 0 0 0 0 0 0 0 128 1 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 57 0x10007 0x176e 0x30 0x0 0x50002 0x0 0xb0007 0x176e 0x140 0x0 0x180004 0x0 0x0 0x0 0x0 0x0 0x0 0x1e0004 0x0 0x0 0x0 0x0 0x0 0x0 0x1f0005 0x0 0x0 0x0 0x0 0x0 0x0 0x220004 0x0 0x0 0x0 0x0 0x0 0x0 0x260007 0x0 0x30 0x0 0x2a0002 0x0 0x340002 0x0 0x3d0002 0x176e 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil getChars (Ljava/lang/CharSequence;[CIII)V 2 5792 orig 320 224 213 189 188 255 127 0 0 136 58 178 79 166 2 0 0 64 8 0 0 96 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 164 0 0 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 1 0 30 0 2 0 0 0 0 0 0 0 160 6 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 225 0x10007 0x1480 0x30 0x0 0x50002 0x0 0x90007 0x1480 0x30 0x0 0xd0002 0x0 0x8000000400110004 0xffffffffffffffe4 0x0 0x2a651e076c0 0x1468 0x2a64cb502a0 0x1c 0x140007 0x1c 0x90 0x1468 0x180004 0x0 0x0 0x2a651e076c0 0x1468 0x0 0x0 0x220005 0x0 0x0 0x2a651e076c0 0x1468 0x0 0x0 0x2c0007 0x1a 0x4e8 0x2 0x300004 0x0 0x0 0x2a64cb502a0 0x2 0x0 0x0 0x330007 0x0 0x90 0x2 0x370004 0x0 0x0 0x2a64cb502a0 0x2 0x0 0x0 0x410005 0x2 0x0 0x0 0x0 0x0 0x0 0x460004 0x0 0x0 0x0 0x0 0x0 0x0 0x490007 0x0 0x138 0x0 0x4d0004 0x0 0x0 0x0 0x0 0x0 0x0 0x540005 0x0 0x0 0x0 0x0 0x0 0x0 0x5f0005 0x0 0x0 0x0 0x0 0x0 0x0 0x690005 0x0 0x0 0x0 0x0 0x0 0x0 0x710005 0x0 0x0 0x0 0x0 0x0 0x0 0x770004 0x0 0x0 0x0 0x0 0x0 0x0 0x7a0007 0x0 0xc8 0x0 0x830005 0x0 0x0 0x0 0x0 0x0 0x0 0x880004 0x0 0x0 0x0 0x0 0x0 0x0 0x8d0005 0x0 0x0 0x0 0x0 0x0 0x0 0x940004 0x0 0x0 0x0 0x0 0x0 0x0 0x970007 0x0 0x90 0x0 0x9b0004 0x0 0x0 0x0 0x0 0x0 0x0 0xa50005 0x0 0x0 0x0 0x0 0x0 0x0 0xaa0004 0x0 0x0 0x0 0x0 0x0 0x0 0xad0007 0x0 0x90 0x0 0xb10004 0x0 0x0 0x0 0x0 0x0 0x0 0xbb0005 0x0 0x0 0x0 0x0 0x0 0x0 0xcf0007 0x1a 0x90 0x60 0xd60007 0x0 0x70 0x60 0xe10005 0x0 0x0 0x2a64cb502a0 0x60 0x0 0x0 0xed0003 0x60 0xffffffffffffff88 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0x0 0x0 0x0 0x0 0x0 oops 7 15 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText 17 java/lang/String 26 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText 33 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText 44 java/lang/String 55 java/lang/String 205 java/lang/String methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/util/text/ImmutableText getChars (II[CI)V 2 5736 orig 320 224 213 189 188 255 127 0 0 184 140 178 79 166 2 0 0 8 2 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 65 163 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 6 0 2 0 0 0 0 0 0 0 104 0 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 26 0x10007 0x1468 0x30 0x0 0x60002 0x0 0x120005 0x0 0x0 0x2a651aa7000 0x1468 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0x0 0x0 0x0 0x0 0x0 oops 1 9 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode methods 0 +ciMethodData org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenText ()Ljava/lang/String; 2 7086 orig 320 224 213 189 188 255 127 0 0 32 67 83 83 166 2 0 0 160 2 0 0 240 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 113 209 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 39 0 2 0 0 0 0 0 0 0 32 1 0 0 254 255 255 255 2 0 1 0 0 0 0 0 data 45 0x10002 0x1a2e 0x40007 0x1236 0x30 0x7f8 0x80002 0x7f8 0xd0005 0x0 0x0 0x2a64e853290 0x1236 0x0 0x0 0x160005 0x0 0x0 0x2a65167ec20 0x1236 0x0 0x0 0x190007 0x1236 0x60 0x0 0x200007 0x0 0x20 0x0 0x2a0007 0x0 0x20 0x0 0x310002 0x1236 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 2 11 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl 18 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenText ()Ljava/lang/String; 2 7600 orig 320 224 213 189 188 255 127 0 0 120 89 83 83 166 2 0 0 184 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 1 0 0 137 225 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 16 0x40005 0x0 0x0 0x2a65148dc90 0x1c31 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 1 3 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl getTokenText ()Ljava/lang/String; 2 7885 orig 320 224 213 189 188 255 127 0 0 16 187 79 83 166 2 0 0 72 3 0 0 32 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 105 234 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 24 0 2 0 0 0 0 0 0 0 200 1 0 0 254 255 255 255 5 0 1 0 0 0 0 0 data 66 0x10005 0x1d4d 0x0 0x0 0x0 0x0 0x0 0x40007 0x1d4d 0x20 0x0 0xa0005 0x0 0x0 0x2a65148dc90 0x1d4d 0x0 0x0 0xf0004 0xffffffffffffe2b3 0x0 0x2a6528b5c90 0x16 0x0 0x0 0x120007 0x1d4d 0x90 0x0 0x160004 0x0 0x0 0x0 0x0 0x0 0x0 0x190005 0x0 0x0 0x0 0x0 0x0 0x0 0x350005 0x0 0x0 0x2a651e076c0 0x10d7 0x2a64cb502a0 0xc76 0x3a0005 0x0 0x0 0x2a651e07770 0x10d7 0x2a64cb502a0 0xc76 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 6 14 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl 21 org/jetbrains/kotlin/lexer/KtToken 46 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText 48 java/lang/String 53 org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence 55 java/lang/String methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/util/text/ImmutableText subSequence (II)Ljava/lang/CharSequence; 2 5529 orig 320 224 213 189 188 255 127 0 0 56 133 178 79 166 2 0 0 24 2 0 0 88 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 201 156 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 8 0 2 0 0 0 0 0 0 0 136 0 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 28 0x10007 0x1399 0x78 0x0 0x60005 0x0 0x0 0x0 0x0 0x0 0x0 0x90007 0x0 0x20 0x0 0x150002 0x1399 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence (Ljava/lang/CharSequence;II)V 2 5529 orig 320 224 213 189 188 255 127 0 0 80 122 88 83 166 2 0 0 80 4 0 0 184 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 201 156 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 22 0 2 0 0 0 0 0 0 0 184 2 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 99 0x10007 0x1399 0x30 0x0 0x50002 0x0 0x90002 0x1399 0xd0007 0x0 0x98 0x1399 0x120005 0x0 0x0 0x2a651e076c0 0x1399 0x0 0x0 0x170007 0x0 0x40 0x1399 0x1c0007 0x1399 0x200 0x0 0x270002 0x0 0x2c0005 0x0 0x0 0x0 0x0 0x0 0x0 0x300005 0x0 0x0 0x0 0x0 0x0 0x0 0x350005 0x0 0x0 0x0 0x0 0x0 0x0 0x3a0005 0x0 0x0 0x0 0x0 0x0 0x0 0x3e0005 0x0 0x0 0x0 0x0 0x0 0x0 0x430005 0x0 0x0 0x0 0x0 0x0 0x0 0x470005 0x0 0x0 0x0 0x0 0x0 0x0 0x4a0005 0x0 0x0 0x0 0x0 0x0 0x0 0x4d0002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x4 0xe 0xffffffffffffffff 0x0 0x0 oops 1 15 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker drop ()V 2 25801 orig 320 224 213 189 188 255 127 0 0 232 107 80 83 166 2 0 0 200 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 73 22 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 72 0 0 0 254 255 255 255 2 0 4 0 0 0 0 0 data 18 0x40002 0x62c9 0x80005 0x62c9 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0xffffffffffffffff oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction dropMarker (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker;)V 2 19371 orig 320 224 213 189 188 255 127 0 0 0 20 82 83 166 2 0 0 0 3 0 0 192 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 89 77 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 1 0 32 0 2 0 0 0 0 0 0 0 120 1 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 57 0x10007 0x49ab 0x30 0x0 0x50002 0x0 0x90005 0x0 0x0 0x2a65167c570 0x49ab 0x0 0x0 0xc0007 0x49ab 0x90 0x0 0x160005 0x0 0x0 0x0 0x0 0x0 0x0 0x190005 0x0 0x0 0x0 0x0 0x0 0x0 0x200002 0x49ab 0x230005 0x0 0x0 0x2a64e2f3ee0 0x49ab 0x0 0x0 0x2c0005 0x49ab 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 2 9 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker 36 org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction methods 0 +ciMethodData org/jetbrains/kotlin/parsing/AbstractKotlinParsing atSet (Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet;)Z 2 22913 orig 320 224 213 189 188 255 127 0 0 104 100 84 83 166 2 0 0 248 4 0 0 224 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 9 188 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 27 0 2 0 0 0 0 0 0 0 112 3 0 0 254 255 255 255 2 0 2 0 0 0 0 0 data 120 0x20002 0x5781 0x50007 0x4bcf 0x20 0xbb2 0xb0005 0x0 0x0 0x2a654335640 0xa9a 0x2a65167bd70 0x4135 0x130007 0x3291 0x190 0x193e 0x1d0005 0x0 0x0 0x2a64e853290 0x193e 0x0 0x0 0x220005 0x0 0x0 0x2a6543356f0 0x193e 0x0 0x0 0x270104 0x0 0x0 0x2a6543357a0 0xcd 0x2a654333ce0 0x11 0x2c0007 0x1860 0xb0 0xde 0x310005 0x0 0x0 0x2a65167ec20 0xde 0x0 0x0 0x340007 0x1d 0x58 0xc1 0x3c0005 0x0 0x0 0x2a64e853290 0xc1 0x0 0x0 0x430003 0x187d 0x190 0x4a0005 0x0 0x0 0x2a65167ec20 0x3291 0x0 0x0 0x4d0007 0x2dd3 0x140 0x4be 0x510004 0xfffffffffffffb44 0x0 0x2a64e8f4870 0x12 0x2a6543357a0 0x2 0x540007 0x4bc 0xe8 0x2 0x580004 0x0 0x0 0x2a6543357a0 0x2 0x0 0x0 0x5b0005 0x0 0x0 0x2a6543357a0 0x2 0x0 0x0 0x5e0007 0x0 0x58 0x2 0x680005 0x0 0x0 0x2a64e853290 0x2 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 14 9 org/jetbrains/kotlin/parsing/KotlinParsing 11 org/jetbrains/kotlin/parsing/KotlinExpressionParsing 20 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl 27 java/util/HashMap 34 org/jetbrains/kotlin/lexer/KtModifierKeywordToken 36 org/jetbrains/kotlin/lexer/KtKeywordToken 45 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet 56 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl 66 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet 77 org/jetbrains/kotlin/lexer/KtSingleValueToken 79 org/jetbrains/kotlin/lexer/KtModifierKeywordToken 88 org/jetbrains/kotlin/lexer/KtModifierKeywordToken 95 org/jetbrains/kotlin/lexer/KtModifierKeywordToken 106 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/parsing/AbstractKotlinParsing _atSet (Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet;)Z 2 22777 orig 320 224 213 189 188 255 127 0 0 64 98 84 83 166 2 0 0 64 3 0 0 64 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 201 183 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 14 0 2 0 0 0 0 0 0 0 184 1 0 0 254 255 255 255 5 0 1 0 0 0 0 0 data 65 0x10005 0x0 0x0 0x2a654335640 0xb93 0x2a65167bd70 0x4b66 0x70005 0x0 0x0 0x2a65167ec20 0x56f9 0x0 0x0 0xa0007 0x4b9d 0x20 0xb5c 0x130005 0x0 0x0 0x2a65167ec20 0x4b9d 0x0 0x0 0x160007 0x4b56 0xf0 0x47 0x1a0005 0x0 0x0 0x2a654335640 0x47 0x0 0x0 0x1d0007 0x47 0x20 0x0 0x260007 0x47 0x20 0x0 0x2f0005 0x0 0x0 0x2a64e853290 0x47 0x0 0x0 0x340007 0x4 0x20 0x43 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 6 3 org/jetbrains/kotlin/parsing/KotlinParsing 5 org/jetbrains/kotlin/parsing/KotlinExpressionParsing 10 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet 21 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet 32 org/jetbrains/kotlin/parsing/KotlinParsing 47 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence toString ()Ljava/lang/String; 2 4695 orig 320 224 213 189 188 255 127 0 0 224 125 88 83 166 2 0 0 200 2 0 0 232 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 185 130 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 11 0 2 0 0 0 0 0 0 0 72 1 0 0 254 255 255 255 4 0 4 0 0 0 0 0 data 50 0x40004 0xffffffffffffefa9 0x0 0x2a651e076c0 0x157 0x0 0x0 0x70007 0x1057 0xc0 0x0 0xe0004 0x0 0x0 0x0 0x0 0x0 0x0 0x190005 0x0 0x0 0x0 0x0 0x0 0x0 0x1d0007 0x0 0x30 0x0 0x210002 0x0 0x310002 0x1057 0x340002 0x1057 0x380007 0x1057 0x30 0x0 0x3c0002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 1 3 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil fromSequence (Ljava/lang/CharSequence;II)[C 2 4695 orig 320 224 213 189 188 255 127 0 0 168 61 178 79 166 2 0 0 0 2 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 185 130 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 7 0 2 0 0 0 0 0 0 0 112 0 0 0 254 255 255 255 7 0 1 0 0 0 0 0 data 25 0x10007 0x1057 0x30 0x0 0x60002 0x0 0x160002 0x1057 0x1b0007 0x1057 0x30 0x0 0x200002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/parsing/KotlinExpressionParsing interruptedWithNewLine ()Z 2 18110 orig 320 224 213 189 188 255 127 0 0 104 7 85 83 166 2 0 0 128 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 241 37 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 9 0 2 0 0 0 0 0 0 0 0 1 0 0 254 255 255 255 5 0 4 0 0 0 0 0 data 41 0x40005 0x0 0x0 0x2a65167bd70 0x44be 0x0 0x0 0x70005 0x0 0x0 0x2a65167ec20 0x44be 0x0 0x0 0xa0007 0x1c9 0x90 0x42f5 0x110005 0x0 0x0 0x2a64e853290 0x42f5 0x0 0x0 0x160007 0x2e19 0x38 0x14dc 0x1a0003 0x14dc 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 3 3 org/jetbrains/kotlin/parsing/KotlinExpressionParsing 10 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet 21 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/parsing/KotlinExpressionParsing parseBinaryExpression (Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence;)V 2 16903 orig 320 224 213 189 188 255 127 0 0 112 183 84 83 166 2 0 0 248 3 0 0 56 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 57 0 2 0 153 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 1 0 23 0 2 0 0 0 0 0 0 0 112 2 0 0 254 255 255 255 5 0 1 0 0 0 0 0 data 88 0x10005 0x0 0x0 0x2a65167bd70 0x4007 0x0 0x0 0x70005 0x521 0x0 0x2a65167bfa0 0x34cd 0x2a65167c4c0 0x619 0xb0002 0x419a 0xe0007 0x148c 0x1b8 0x2d0e 0x130005 0x2d0e 0x0 0x0 0x0 0x0 0x0 0x160005 0x0 0x0 0x2a65167bd70 0x2d0e 0x0 0x0 0x190007 0x2b7b 0x128 0x193 0x1d0005 0x0 0x0 0x2a65167bd70 0x193 0x0 0x0 0x220002 0x193 0x280005 0x0 0x0 0x2a65167bfa0 0x193 0x0 0x0 0x300005 0x0 0x0 0x2a65167c570 0x193 0x0 0x0 0x360005 0x0 0x0 0x2a65167c570 0x193 0x0 0x0 0x3c0003 0x193 0xfffffffffffffe50 0x400005 0x0 0x0 0x2a65167c570 0x4007 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 9 3 org/jetbrains/kotlin/parsing/KotlinExpressionParsing 10 org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence 12 org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence$2 30 org/jetbrains/kotlin/parsing/KotlinExpressionParsing 41 org/jetbrains/kotlin/parsing/KotlinExpressionParsing 50 org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence 57 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker 64 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker 74 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker methods 0 +ciMethodData org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence parseHigherPrecedence (Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing;)V 2 15865 orig 320 224 213 189 188 255 127 0 0 64 85 86 83 166 2 0 0 232 1 0 0 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 201 223 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 4 0 2 0 0 0 0 0 0 0 96 0 0 0 254 255 255 255 7 0 3 0 0 0 0 0 data 22 0x30007 0x3bf9 0x50 0x0 0xa0007 0x0 0x30 0x0 0x110002 0x0 0x1a0002 0x3bf9 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/parsing/KotlinExpressionParsing access$300 (Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing;Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence;)V 2 15865 orig 320 224 213 189 188 255 127 0 0 48 10 85 83 166 2 0 0 120 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 201 223 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 16 0 0 0 254 255 255 255 2 0 2 0 0 0 0 0 data 8 0x20002 0x3bf9 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence getOperations ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; 2 12570 orig 320 224 213 189 188 255 127 0 0 208 86 86 83 166 2 0 0 176 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 135 0 0 0 153 132 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 5 0 2 0 0 0 0 0 0 0 48 0 0 0 254 255 255 255 7 0 5 0 0 0 0 0 data 15 0x50007 0x3093 0x30 0x0 0x90002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/parsing/KotlinExpressionParsing parseOperationReference ()V 1 408 orig 320 224 213 189 188 255 127 0 0 144 193 84 83 166 2 0 0 40 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 193 12 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 168 0 0 0 254 255 255 255 5 0 1 0 0 0 0 0 data 30 0x10005 0x0 0x0 0x2a65167bd70 0x198 0x0 0x0 0x60005 0x0 0x0 0x2a65167bd70 0x198 0x0 0x0 0xd0005 0x0 0x0 0x2a65167c570 0x198 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 3 3 org/jetbrains/kotlin/parsing/KotlinExpressionParsing 10 org/jetbrains/kotlin/parsing/KotlinExpressionParsing 17 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker precede ()Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 2 1443 orig 320 224 213 189 188 255 127 0 0 32 107 80 83 166 2 0 0 192 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 84 1 0 0 121 34 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 6 0 2 0 0 0 0 0 0 0 64 0 0 0 254 255 255 255 2 0 5 0 0 0 0 0 data 17 0x50002 0x44f 0x90007 0x44f 0x30 0x0 0xd0002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0xffffffffffffffff oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl access$600 (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl;Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker;)Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 2 1443 orig 320 224 213 189 188 255 127 0 0 80 241 79 83 166 2 0 0 120 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 84 1 0 0 121 34 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 16 0 0 0 254 255 255 255 2 0 2 0 0 0 0 0 data 8 0x20002 0x44f 0x0 0x0 0x9 0x2 0x0 0xffffffffffffffff oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl precede (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$StartMarker;)Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 2 2279 orig 320 224 213 189 188 255 127 0 0 232 170 79 83 166 2 0 0 168 2 0 0 112 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 84 1 0 0 153 60 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 10 0 2 0 0 0 0 0 0 0 32 1 0 0 254 255 255 255 7 0 3 0 0 0 0 0 data 46 0x30007 0x793 0x50 0x0 0xa0007 0x0 0x30 0x0 0x140002 0x0 0x1c0007 0x793 0x58 0x0 0x240005 0x0 0x0 0x0 0x0 0x0 0x0 0x2c0002 0x793 0x360005 0x793 0x0 0x0 0x0 0x0 0x0 0x3b0007 0x793 0x30 0x0 0x400002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0xffffffffffffffff oops 0 methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter remapCurrentToken (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)V 1 395 orig 320 224 213 189 188 255 127 0 0 216 85 83 83 166 2 0 0 192 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 1 0 0 1 4 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 5 0 0 0 0 0 data 17 0x50005 0x0 0x0 0x2a65148dc90 0x80 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0xffffffffffffffff oops 1 3 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl methods 0 +ciMethodData org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction addBefore (Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$ProductionMarker;Lorg/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl$ProductionMarker;)V 2 2279 orig 320 224 213 189 188 255 127 0 0 16 11 82 83 166 2 0 0 216 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 135 1 0 0 1 59 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 2 0 0 0 0 0 0 0 72 0 0 0 254 255 255 255 2 0 3 0 0 0 0 0 data 20 0x30002 0x760 0xa0005 0x0 0x0 0x2a64e2f3ee0 0x760 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0xffffffffffffffff 0x0 0xffffffffffffffff oops 1 5 org/jetbrains/kotlin/com/intellij/lang/impl/MarkerProduction methods 0 +ciMethodData org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence parseRightHandSide (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing;)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 1 407 orig 320 224 213 189 188 255 127 0 0 32 86 86 83 166 2 0 0 200 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 3 0 0 248 31 0 0 2 0 0 0 0 0 3 0 1 0 0 0 0 0 0 0 56 0 0 0 254 255 255 255 5 0 2 0 0 0 0 0 data 18 0x20005 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0xffffffffffffffff 0x0 0xffffffffffffffff oops 0 methods 0 +compile org/jetbrains/kotlin/parsing/KotlinExpressionParsing parseBinaryExpression (Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence;)V -1 4 inline 285 0 -1 org/jetbrains/kotlin/parsing/KotlinExpressionParsing parseBinaryExpression (Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence;)V 1 1 org/jetbrains/kotlin/parsing/AbstractKotlinParsing mark ()Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 1 11 org/jetbrains/kotlin/parsing/KotlinExpressionParsing interruptedWithNewLine ()Z 2 4 org/jetbrains/kotlin/parsing/AbstractKotlinParsing tt ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 3 4 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4 1 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl joinComplexTokens ()Z 5 4 org/jetbrains/kotlin/com/intellij/util/containers/Stack peek ()Ljava/lang/Object; 6 1 java/util/ArrayList size ()I 6 21 java/util/ArrayList get (I)Ljava/lang/Object; 7 5 java/util/Objects checkIndex (II)I 7 11 java/util/ArrayList elementData (I)Ljava/lang/Object; 5 10 java/lang/Boolean booleanValue ()Z 4 8 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4 14 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4 18 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getJoinedTokenType (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 5 9 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 6 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 5 47 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 6 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2 7 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet contains (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)Z 3 7 org/jetbrains/kotlin/com/intellij/psi/tree/IElementType getIndex ()S 3 26 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet get (I)Z 1 19 org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence getOperations ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; 1 22 org/jetbrains/kotlin/parsing/AbstractKotlinParsing atSet (Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet;)Z 2 11 org/jetbrains/kotlin/parsing/AbstractKotlinParsing tt ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 3 4 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4 1 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl joinComplexTokens ()Z 5 4 org/jetbrains/kotlin/com/intellij/util/containers/Stack peek ()Ljava/lang/Object; 6 1 java/util/ArrayList size ()I 6 21 java/util/ArrayList get (I)Ljava/lang/Object; 7 5 java/util/Objects checkIndex (II)I 7 11 java/util/ArrayList elementData (I)Ljava/lang/Object; 5 10 java/lang/Boolean booleanValue ()Z 4 8 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4 14 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4 18 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getJoinedTokenType (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 5 9 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 6 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 5 47 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 6 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2 29 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenText ()Ljava/lang/String; 3 1 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl joinComplexTokens ()Z 4 4 org/jetbrains/kotlin/com/intellij/util/containers/Stack peek ()Ljava/lang/Object; 5 1 java/util/ArrayList size ()I 5 21 java/util/ArrayList get (I)Ljava/lang/Object; 6 5 java/util/Objects checkIndex (II)I 6 11 java/util/ArrayList elementData (I)Ljava/lang/Object; 4 10 java/lang/Boolean booleanValue ()Z 3 8 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenText ()Ljava/lang/String; 4 4 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl getTokenText ()Ljava/lang/String; 5 53 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText subSequence (II)Ljava/lang/CharSequence; 6 21 org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence (Ljava/lang/CharSequence;II)V 7 9 java/lang/Object ()V 7 18 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText length ()I 8 4 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode length ()I 5 53 java/lang/String subSequence (II)Ljava/lang/CharSequence; 6 3 java/lang/String substring (II)Ljava/lang/String; 7 1 java/lang/String length ()I 8 6 java/lang/String coder ()B 7 8 java/lang/String checkBoundsBeginEnd (III)V 7 28 java/lang/String isLatin1 ()Z 7 41 java/lang/StringLatin1 newString ([BII)Ljava/lang/String; 8 9 java/util/Arrays copyOfRange ([BII)[B 8 13 java/lang/String ([BB)V 9 1 java/lang/Object ()V 5 58 org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence toString ()Ljava/lang/String; 6 49 org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil fromSequence (Ljava/lang/CharSequence;II)[C 7 22 org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil getChars (Ljava/lang/CharSequence;[CIII)V 8 34 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText getChars (II[CI)V 9 18 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode getChars (II[CI)V 10 14 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode length ()I 10 55 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode byteToChar (B)C 8 225 java/lang/String charAt (I)C 9 1 java/lang/String isLatin1 ()Z 9 12 java/lang/StringLatin1 charAt ([BI)C 9 21 java/lang/StringUTF16 charAt ([BI)C 10 2 java/lang/StringUTF16 checkIndex (I[B)V 6 52 org/jetbrains/kotlin/com/intellij/util/text/StringFactory createShared ([C)Ljava/lang/String; 7 61 java/lang/String ([C)V 8 6 java/lang/String ([CIILjava/lang/Void;)V 9 1 java/lang/Object ()V 9 36 java/lang/StringUTF16 compress ([CII)[B 5 58 java/lang/String toString ()Ljava/lang/String; 3 13 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4 1 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl joinComplexTokens ()Z 5 4 org/jetbrains/kotlin/com/intellij/util/containers/Stack peek ()Ljava/lang/Object; 6 1 java/util/ArrayList size ()I 6 21 java/util/ArrayList get (I)Ljava/lang/Object; 7 5 java/util/Objects checkIndex (II)I 7 11 java/util/ArrayList elementData (I)Ljava/lang/Object; 5 10 java/lang/Boolean booleanValue ()Z 4 8 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4 14 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4 18 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getJoinedTokenType (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 5 9 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 6 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 5 47 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 6 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 3 22 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet contains (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)Z 4 7 org/jetbrains/kotlin/com/intellij/psi/tree/IElementType getIndex ()S 4 26 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet get (I)Z 3 49 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenText ()Ljava/lang/String; 4 4 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl getTokenText ()Ljava/lang/String; 5 53 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText subSequence (II)Ljava/lang/CharSequence; 6 21 org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence (Ljava/lang/CharSequence;II)V 7 9 java/lang/Object ()V 7 18 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText length ()I 8 4 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode length ()I 5 53 java/lang/String subSequence (II)Ljava/lang/CharSequence; 6 3 java/lang/String substring (II)Ljava/lang/String; 7 1 java/lang/String length ()I 8 6 java/lang/String coder ()B 7 8 java/lang/String checkBoundsBeginEnd (III)V 7 28 java/lang/String isLatin1 ()Z 7 41 java/lang/StringLatin1 newString ([BII)Ljava/lang/String; 8 9 java/util/Arrays copyOfRange ([BII)[B 8 13 java/lang/String ([BB)V 9 1 java/lang/Object ()V 5 58 org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence toString ()Ljava/lang/String; 6 49 org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil fromSequence (Ljava/lang/CharSequence;II)[C 7 22 org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil getChars (Ljava/lang/CharSequence;[CIII)V 8 34 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText getChars (II[CI)V 9 18 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode getChars (II[CI)V 10 14 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode length ()I 10 55 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText$Leaf8BitNode byteToChar (B)C 8 225 java/lang/String charAt (I)C 9 1 java/lang/String isLatin1 ()Z 9 12 java/lang/StringLatin1 charAt ([BI)C 9 21 java/lang/StringUTF16 charAt ([BI)C 10 2 java/lang/StringUTF16 checkIndex (I[B)V 6 52 org/jetbrains/kotlin/com/intellij/util/text/StringFactory createShared ([C)Ljava/lang/String; 7 61 java/lang/String ([C)V 8 6 java/lang/String ([CIILjava/lang/Void;)V 9 1 java/lang/Object ()V 9 36 java/lang/StringUTF16 compress ([CII)[B 5 58 java/lang/String toString ()Ljava/lang/String; 2 34 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 3 2 java/util/HashMap hash (Ljava/lang/Object;)I 4 9 java/lang/String hashCode ()I 5 19 java/lang/String isLatin1 ()Z 5 29 java/lang/StringLatin1 hashCode ([B)I 3 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 4 59 java/lang/String equals (Ljava/lang/Object;)Z 5 20 java/lang/String coder ()B 5 24 java/lang/String coder ()B 5 31 java/lang/String isLatin1 ()Z 4 126 java/lang/String equals (Ljava/lang/Object;)Z 5 20 java/lang/String coder ()B 5 24 java/lang/String coder ()B 5 31 java/lang/String isLatin1 ()Z 2 49 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet contains (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)Z 3 7 org/jetbrains/kotlin/com/intellij/psi/tree/IElementType getIndex ()S 3 26 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet get (I)Z 2 60 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter remapCurrentToken (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)V 2 74 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet contains (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)Z 3 7 org/jetbrains/kotlin/com/intellij/psi/tree/IElementType getIndex ()S 3 26 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet get (I)Z 2 91 org/jetbrains/kotlin/lexer/KtKeywordToken isSoft ()Z 2 104 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter remapCurrentToken (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)V 1 29 org/jetbrains/kotlin/parsing/AbstractKotlinParsing tt ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2 4 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 3 1 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl joinComplexTokens ()Z 4 4 org/jetbrains/kotlin/com/intellij/util/containers/Stack peek ()Ljava/lang/Object; 5 1 java/util/ArrayList size ()I 5 21 java/util/ArrayList get (I)Ljava/lang/Object; 6 5 java/util/Objects checkIndex (II)I 6 11 java/util/ArrayList elementData (I)Ljava/lang/Object; 4 10 java/lang/Boolean booleanValue ()Z 3 8 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 3 14 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 3 18 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getJoinedTokenType (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4 9 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 5 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 4 47 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 5 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 1 34 org/jetbrains/kotlin/parsing/KotlinExpressionParsing parseOperationReference ()V 2 1 org/jetbrains/kotlin/parsing/AbstractKotlinParsing mark ()Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 1 40 org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence parseRightHandSide (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing;)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 2 2 org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence parseHigherPrecedence (Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing;)V 3 26 org/jetbrains/kotlin/parsing/KotlinExpressionParsing access$300 (Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing;Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence;)V 4 2 org/jetbrains/kotlin/parsing/KotlinExpressionParsing parseBinaryExpression (Lorg/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence;)V 5 1 org/jetbrains/kotlin/parsing/AbstractKotlinParsing mark ()Lorg/jetbrains/kotlin/com/intellij/lang/PsiBuilder$Marker; 5 11 org/jetbrains/kotlin/parsing/KotlinExpressionParsing interruptedWithNewLine ()Z 6 4 org/jetbrains/kotlin/parsing/AbstractKotlinParsing tt ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 7 4 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 8 1 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl joinComplexTokens ()Z 9 4 org/jetbrains/kotlin/com/intellij/util/containers/Stack peek ()Ljava/lang/Object; 10 1 java/util/ArrayList size ()I 10 21 java/util/ArrayList get (I)Ljava/lang/Object; 11 5 java/util/Objects checkIndex (II)I 9 10 java/lang/Boolean booleanValue ()Z 8 8 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 8 14 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 8 18 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getJoinedTokenType (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 9 9 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 10 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 9 47 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 10 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 6 7 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet contains (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)Z 7 7 org/jetbrains/kotlin/com/intellij/psi/tree/IElementType getIndex ()S 7 26 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet get (I)Z 5 19 org/jetbrains/kotlin/parsing/KotlinExpressionParsing$Precedence getOperations ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet; 5 22 org/jetbrains/kotlin/parsing/AbstractKotlinParsing atSet (Lorg/jetbrains/kotlin/com/intellij/psi/tree/TokenSet;)Z 6 11 org/jetbrains/kotlin/parsing/AbstractKotlinParsing tt ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 7 4 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 8 1 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl joinComplexTokens ()Z 9 4 org/jetbrains/kotlin/com/intellij/util/containers/Stack peek ()Ljava/lang/Object; 10 1 java/util/ArrayList size ()I 10 21 java/util/ArrayList get (I)Ljava/lang/Object; 11 5 java/util/Objects checkIndex (II)I 9 10 java/lang/Boolean booleanValue ()Z 8 8 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 8 14 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 8 18 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getJoinedTokenType (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 9 9 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 10 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 9 47 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 10 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 6 29 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenText ()Ljava/lang/String; 7 1 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl joinComplexTokens ()Z 8 4 org/jetbrains/kotlin/com/intellij/util/containers/Stack peek ()Ljava/lang/Object; 9 1 java/util/ArrayList size ()I 9 21 java/util/ArrayList get (I)Ljava/lang/Object; 10 5 java/util/Objects checkIndex (II)I 10 11 java/util/ArrayList elementData (I)Ljava/lang/Object; 8 10 java/lang/Boolean booleanValue ()Z 7 8 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenText ()Ljava/lang/String; 8 4 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl getTokenText ()Ljava/lang/String; 9 53 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText subSequence (II)Ljava/lang/CharSequence; 10 21 org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence (Ljava/lang/CharSequence;II)V 9 53 java/lang/String subSequence (II)Ljava/lang/CharSequence; 10 3 java/lang/String substring (II)Ljava/lang/String; 9 58 org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence toString ()Ljava/lang/String; 10 49 org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil fromSequence (Ljava/lang/CharSequence;II)[C 10 52 org/jetbrains/kotlin/com/intellij/util/text/StringFactory createShared ([C)Ljava/lang/String; 9 58 java/lang/String toString ()Ljava/lang/String; 7 13 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 8 1 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl joinComplexTokens ()Z 9 4 org/jetbrains/kotlin/com/intellij/util/containers/Stack peek ()Ljava/lang/Object; 10 1 java/util/ArrayList size ()I 10 21 java/util/ArrayList get (I)Ljava/lang/Object; 11 5 java/util/Objects checkIndex (II)I 9 10 java/lang/Boolean booleanValue ()Z 8 8 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 8 14 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenType ()Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 8 18 org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl getJoinedTokenType (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 9 9 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 10 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 9 47 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 10 5 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl rawLookup (I)Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType; 7 22 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet contains (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)Z 8 7 org/jetbrains/kotlin/com/intellij/psi/tree/IElementType getIndex ()S 8 26 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet get (I)Z 7 49 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter getTokenText ()Ljava/lang/String; 8 4 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderImpl getTokenText ()Ljava/lang/String; 9 53 org/jetbrains/kotlin/com/intellij/util/text/ImmutableText subSequence (II)Ljava/lang/CharSequence; 10 21 org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence (Ljava/lang/CharSequence;II)V 9 53 java/lang/String subSequence (II)Ljava/lang/CharSequence; 10 3 java/lang/String substring (II)Ljava/lang/String; 9 58 org/jetbrains/kotlin/com/intellij/util/text/CharSequenceSubSequence toString ()Ljava/lang/String; 10 49 org/jetbrains/kotlin/com/intellij/util/text/CharArrayUtil fromSequence (Ljava/lang/CharSequence;II)[C 10 52 org/jetbrains/kotlin/com/intellij/util/text/StringFactory createShared ([C)Ljava/lang/String; 9 58 java/lang/String toString ()Ljava/lang/String; 6 34 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 7 2 java/util/HashMap hash (Ljava/lang/Object;)I 8 9 java/lang/String hashCode ()I 9 19 java/lang/String isLatin1 ()Z 9 29 java/lang/StringLatin1 hashCode ([B)I 7 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 8 59 java/lang/String equals (Ljava/lang/Object;)Z 9 20 java/lang/String coder ()B 9 24 java/lang/String coder ()B 9 31 java/lang/String isLatin1 ()Z 8 126 java/lang/String equals (Ljava/lang/Object;)Z 9 20 java/lang/String coder ()B 9 24 java/lang/String coder ()B 9 31 java/lang/String isLatin1 ()Z 6 49 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet contains (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)Z 7 7 org/jetbrains/kotlin/com/intellij/psi/tree/IElementType getIndex ()S 7 26 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet get (I)Z 6 60 org/jetbrains/kotlin/com/intellij/lang/impl/PsiBuilderAdapter remapCurrentToken (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)V 6 74 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet contains (Lorg/jetbrains/kotlin/com/intellij/psi/tree/IElementType;)Z 7 7 org/jetbrains/kotlin/com/intellij/psi/tree/IElementType getIndex ()S 7 26 org/jetbrains/kotlin/com/intellij/psi/tree/TokenSet get (I)Z 6 91 org/jetbrains/kotlin/lexer/KtKeywordToken isSoft ()Z diff --git a/rtmp/.gitignore b/rtmp/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/rtmp/.gitignore @@ -0,0 +1 @@ +/build diff --git a/rtmp/build.gradle b/rtmp/build.gradle new file mode 100644 index 0000000..2990edf --- /dev/null +++ b/rtmp/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 30 + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 30 + versionCode 182 + versionName "1.8.2" + } + buildTypes { + release { + minifyEnabled false + } + } +} + +dependencies { + api 'androidx.annotation:annotation:1.2.0' +} diff --git a/rtmp/src/main/AndroidManifest.xml b/rtmp/src/main/AndroidManifest.xml new file mode 100644 index 0000000..733158c --- /dev/null +++ b/rtmp/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/Crypto.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/Crypto.java new file mode 100644 index 0000000..faafee8 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/Crypto.java @@ -0,0 +1,67 @@ +package com.github.faucamp.simplertmp; + +import android.util.Log; + +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +/** + * Some helper utilities for SHA256, mostly (used during handshake) + * This is separated in order to be more easily replaced on platforms that + * do not have the javax.crypto.* and/or java.security.* packages + * + * This implementation is directly inspired by the RTMPHandshake class of the + * Red5 Open Source Flash Server project + * + * @author francois + */ +public class Crypto { + + private static final String TAG = "Crypto"; + + private Mac hmacSHA256; + + public Crypto() { + try { + hmacSHA256 = Mac.getInstance("HmacSHA256"); + } catch (SecurityException e) { + Log.e(TAG, "Security exception when getting HMAC", e); + } catch (NoSuchAlgorithmException e) { + Log.e(TAG, "HMAC SHA256 does not exist"); + } + } + + /** + * Calculates an HMAC SHA256 hash using a default key length. + * + * @return hmac hashed bytes + */ + public byte[] calculateHmacSHA256(byte[] input, byte[] key) { + byte[] output = null; + try { + hmacSHA256.init(new SecretKeySpec(key, "HmacSHA256")); + output = hmacSHA256.doFinal(input); + } catch (InvalidKeyException e) { + Log.e(TAG, "Invalid key", e); + } + return output; + } + + /** + * Calculates an HMAC SHA256 hash using a set key length. + * + * @return hmac hashed bytes + */ + public byte[] calculateHmacSHA256(byte[] input, byte[] key, int length) { + byte[] output = null; + try { + hmacSHA256.init(new SecretKeySpec(key, 0, length, "HmacSHA256")); + output = hmacSHA256.doFinal(input); + } catch (InvalidKeyException e) { + Log.e(TAG, "Invalid key", e); + } + return output; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/DefaultRtmpPublisher.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/DefaultRtmpPublisher.java new file mode 100644 index 0000000..4e62594 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/DefaultRtmpPublisher.java @@ -0,0 +1,53 @@ +package com.github.faucamp.simplertmp; + +import com.github.faucamp.simplertmp.io.RtmpConnection; +import net.ossrs.rtmp.ConnectCheckerRtmp; + +/** + * Srs implementation of an RTMP publisher + * + * @author francois, leoma, pedro + */ +public class DefaultRtmpPublisher implements RtmpPublisher { + + private RtmpConnection rtmpConnection; + + public DefaultRtmpPublisher(ConnectCheckerRtmp connectCheckerRtmp) { + rtmpConnection = new RtmpConnection(connectCheckerRtmp); + } + + @Override + public boolean connect(String url) { + return rtmpConnection.connect(url); + } + + @Override + public boolean publish(String publishType) { + return rtmpConnection.publish(publishType); + } + + @Override + public void close() { + rtmpConnection.close(); + } + + @Override + public void publishVideoData(byte[] data, int size, int dts) { + rtmpConnection.publishVideoData(data, size, dts); + } + + @Override + public void publishAudioData(byte[] data, int size, int dts) { + rtmpConnection.publishAudioData(data, size, dts); + } + + @Override + public void setVideoResolution(int width, int height) { + rtmpConnection.setVideoResolution(width, height); + } + + @Override + public void setAuthorization(String user, String password) { + rtmpConnection.setAuthorization(user, password); + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/RtmpPublisher.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/RtmpPublisher.java new file mode 100644 index 0000000..bad9ee0 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/RtmpPublisher.java @@ -0,0 +1,62 @@ +package com.github.faucamp.simplertmp; + +/** + * Simple RTMP publisher, using vanilla Java networking (no NIO) + * This was created primarily to address a NIO bug in Android 2.2 when + * used with Apache Mina, but also to provide an easy-to-use way to access + * RTMP streams + * + * @author francois, leo + */ +public interface RtmpPublisher { + /** + * Issues an RTMP "connect" command and wait for the response. + * + * @param url specify the RTMP url + * @return If succeeded return true else return false + */ + boolean connect(String url); + + /** + * Issues an RTMP "publish" command and write the media content stream packets (audio and video). + * + * @param publishType specify the way to publish raw RTMP packets among "live", "record" and + * "append" + * @return If succeeded return true else return false + * @throws IllegalStateException if the client is not connected to a RTMP server + */ + boolean publish(String publishType); + + /** + * Stop and close the current RTMP streaming client. + */ + void close(); + + /** + * publish a video content packet to server + * + * @param data video stream byte array + * @param size video stream byte size (not the whole length of byte array) + * @param dts video stream decoding timestamp + */ + void publishVideoData(byte[] data, int size, int dts); + + /** + * publish an audio content packet to server + * + * @param data audio stream byte array + * @param size audio stream byte size (not the whole length of byte array) + * @param dts audio stream decoding timestamp + */ + void publishAudioData(byte[] data, int size, int dts); + + /** + * set video resolution + * + * @param width video width + * @param height video height + */ + void setVideoResolution(int width, int height); + + void setAuthorization(String user, String password); +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/Util.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/Util.java new file mode 100644 index 0000000..6cf6e3f --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/Util.java @@ -0,0 +1,195 @@ +package com.github.faucamp.simplertmp; + +import android.util.Base64; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.MessageDigest; + +/** + * Misc utility method + * + * @author francois, pedro + */ +public class Util { + + private static final String HEXES = "0123456789ABCDEF"; + + public static void writeUnsignedInt32(OutputStream out, int value) throws IOException { + out.write((byte) (value >>> 24)); + out.write((byte) (value >>> 16)); + out.write((byte) (value >>> 8)); + out.write((byte) value); + } + + public static int readUnsignedInt32(InputStream in) throws IOException { + return ((in.read() & 0xff) << 24) | ((in.read() & 0xff) << 16) | ((in.read() & 0xff) << 8) | (in + .read() & 0xff); + } + + public static int readUnsignedInt24(InputStream in) throws IOException { + return ((in.read() & 0xff) << 16) | ((in.read() & 0xff) << 8) | (in.read() & 0xff); + } + + public static int readUnsignedInt16(InputStream in) throws IOException { + return ((in.read() & 0xff) << 8) | (in.read() & 0xff); + } + + public static void writeUnsignedInt24(OutputStream out, int value) throws IOException { + out.write((byte) (value >>> 16)); + out.write((byte) (value >>> 8)); + out.write((byte) value); + } + + public static void writeUnsignedInt16(OutputStream out, int value) throws IOException { + out.write((byte) (value >>> 8)); + out.write((byte) value); + } + + public static int toUnsignedInt32(byte[] bytes) { + return (((int) bytes[0] & 0xff) << 24) | (((int) bytes[1] & 0xff) << 16) | (((int) bytes[2] + & 0xff) << 8) | ((int) bytes[3] & 0xff); + } + + public static int toUnsignedInt32LittleEndian(byte[] bytes) { + return ((bytes[3] & 0xff) << 24) + | ((bytes[2] & 0xff) << 16) + | ((bytes[1] & 0xff) << 8) + | (bytes[0] & 0xff); + } + + public static void writeUnsignedInt32LittleEndian(OutputStream out, int value) + throws IOException { + out.write((byte) value); + out.write((byte) (value >>> 8)); + out.write((byte) (value >>> 16)); + out.write((byte) (value >>> 24)); + } + + public static int toUnsignedInt24(byte[] bytes) { + return ((bytes[1] & 0xff) << 16) | ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff); + } + + public static int toUnsignedInt16(byte[] bytes) { + return ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff); + } + + public static String toHexString(byte[] raw) { + if (raw == null) { + return null; + } + final StringBuilder hex = new StringBuilder(2 * raw.length); + for (final byte b : raw) { + hex.append(HEXES.charAt((b & 0xF0) >> 4)).append(HEXES.charAt((b & 0x0F))); + } + return hex.toString(); + } + + public static String toHexString(byte b) { + return new StringBuilder().append(HEXES.charAt((b & 0xF0) >> 4)) + .append(HEXES.charAt((b & 0x0F))) + .toString(); + } + + /** + * Reads bytes from the specified inputstream into the specified target buffer until it is filled up + */ + public static void readBytesUntilFull(InputStream in, byte[] targetBuffer) throws IOException { + int totalBytesRead = 0; + int read; + final int targetBytes = targetBuffer.length; + do { + read = in.read(targetBuffer, totalBytesRead, (targetBytes - totalBytesRead)); + if (read != -1) { + totalBytesRead += read; + } else { + throw new IOException("Unexpected EOF reached before read buffer was filled"); + } + } while (totalBytesRead < targetBytes); + } + + public static byte[] toByteArray(double d) { + long l = Double.doubleToRawLongBits(d); + return new byte[] { + (byte) ((l >> 56) & 0xff), (byte) ((l >> 48) & 0xff), (byte) ((l >> 40) & 0xff), + (byte) ((l >> 32) & 0xff), (byte) ((l >> 24) & 0xff), (byte) ((l >> 16) & 0xff), + (byte) ((l >> 8) & 0xff), (byte) (l & 0xff), + }; + } + + public static byte[] unsignedInt32ToByteArray(int value) throws IOException { + return new byte[] { + (byte) (value >>> 24), (byte) (value >>> 16), (byte) (value >>> 8), (byte) value + }; + } + + public static double readDouble(InputStream in) throws IOException { + long bits = + ((long) (in.read() & 0xff) << 56) + | ((long) (in.read() & 0xff) << 48) + | ((long) (in.read() + & 0xff) << 40) + | ((long) (in.read() & 0xff) << 32) + | ((in.read() & 0xff) << 24) + | ((in.read() & 0xff) << 16) + | ((in.read() & 0xff) << 8) + | (in.read() & 0xff); + return Double.longBitsToDouble(bits); + } + + public static void writeDouble(OutputStream out, double d) throws IOException { + long l = Double.doubleToRawLongBits(d); + out.write(new byte[] { + (byte) ((l >> 56) & 0xff), (byte) ((l >> 48) & 0xff), (byte) ((l >> 40) & 0xff), + (byte) ((l >> 32) & 0xff), (byte) ((l >> 24) & 0xff), (byte) ((l >> 16) & 0xff), + (byte) ((l >> 8) & 0xff), (byte) (l & 0xff) + }); + } + + public static String getSalt(String description) { + String salt = null; + String data[] = description.split("&"); + for (String s : data) { + if (s.contains("salt=")) { + salt = s.substring(5); + break; + } + } + return salt; + } + + public static String getChallenge(String description) { + String challenge = null; + String data[] = description.split("&"); + for (String s : data) { + if (s.contains("challenge=")) { + challenge = s.substring(10); + break; + } + } + return challenge; + } + + public static String getOpaque(String description) { + String opaque = ""; + String data[] = description.split("&"); + for (String s : data) { + if (s.contains("opaque=")) { + opaque = s.substring(7); + break; + } + } + return opaque; + } + + public static String stringToMD5BASE64(String s) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(s.getBytes("UTF-8"), 0, s.length()); + byte[] md5hash = md.digest(); + return Base64.encodeToString(md5hash, Base64.NO_WRAP); + } catch (Exception e) { + return null; + } + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfArray.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfArray.java new file mode 100644 index 0000000..7a8bc9b --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfArray.java @@ -0,0 +1,67 @@ +package com.github.faucamp.simplertmp.amf; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + +import com.github.faucamp.simplertmp.Util; + +/** + * AMF Array + * + * @author francois + */ +public class AmfArray implements AmfData { + + private List items; + private int size = -1; + + @Override + public void writeTo(OutputStream out) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void readFrom(InputStream in) throws IOException { + // Skip data type byte (we assume it's already read) + int length = Util.readUnsignedInt32(in); + size = 5; // 1 + 4 + items = new ArrayList<>(length); + for (int i = 0; i < length; i++) { + AmfData dataItem = AmfDecoder.readFrom(in); + size += dataItem.getSize(); + items.add(dataItem); + } + } + + @Override + public int getSize() { + if (size == -1) { + size = 5; // 1 + 4 + if (items != null) { + for (AmfData dataItem : items) { + size += dataItem.getSize(); + } + } + } + return size; + } + + /** @return the amount of items in this the array */ + public int getLength() { + return items != null ? items.size() : 0; + } + + public List getItems() { + if (items == null) { + items = new ArrayList<>(); + } + return items; + } + + public void addItem(AmfData dataItem) { + getItems().add(this); + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfBoolean.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfBoolean.java new file mode 100644 index 0000000..6ddb39b --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfBoolean.java @@ -0,0 +1,49 @@ +package com.github.faucamp.simplertmp.amf; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * @author francois + */ +public class AmfBoolean implements AmfData { + + private boolean value; + + public boolean isValue() { + return value; + } + + public void setValue(boolean value) { + this.value = value; + } + + public AmfBoolean(boolean value) { + this.value = value; + } + + public AmfBoolean() { + } + + @Override + public void writeTo(OutputStream out) throws IOException { + out.write(AmfType.BOOLEAN.getValue()); + out.write(value ? 0x01 : 0x00); + } + + @Override + public void readFrom(InputStream in) throws IOException { + value = in.read() == 0x01; + } + + public static boolean readBooleanFrom(InputStream in) throws IOException { + // Skip data type byte (we assume it's already read) + return in.read() == 0x01; + } + + @Override + public int getSize() { + return 2; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfData.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfData.java new file mode 100644 index 0000000..a8b5d52 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfData.java @@ -0,0 +1,31 @@ +package com.github.faucamp.simplertmp.amf; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * Base AMF data object. All other AMF data type instances derive from this + * (including AmfObject) + * + * @author francois + */ +public interface AmfData { + + /** + * Write/Serialize this AMF data intance (Object/string/integer etc) to + * the specified OutputStream + */ + void writeTo(OutputStream out) throws IOException; + + /** + * Read and parse bytes from the specified input stream to populate this + * AMFData instance (deserialize) + * + * @return the amount of bytes read + */ + void readFrom(InputStream in) throws IOException; + + /** @return the amount of bytes required for this object */ + int getSize(); +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfDecoder.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfDecoder.java new file mode 100644 index 0000000..4ff7784 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfDecoder.java @@ -0,0 +1,51 @@ +package com.github.faucamp.simplertmp.amf; + +import java.io.IOException; +import java.io.InputStream; + +/** + * @author francois + */ +public class AmfDecoder { + + public static AmfData readFrom(InputStream in) throws IOException { + + byte amfTypeByte = (byte) in.read(); + AmfType amfType = AmfType.valueOf(amfTypeByte); + + AmfData amfData; + if (amfType != null) { + switch (amfType) { + case NUMBER: + amfData = new AmfNumber(); + break; + case BOOLEAN: + amfData = new AmfBoolean(); + break; + case STRING: + amfData = new AmfString(); + break; + case OBJECT: + amfData = new AmfObject(); + break; + case NULL: + return new AmfNull(); + case UNDEFINED: + return new AmfUndefined(); + case ECMA_MAP: + amfData = new AmfMap(); + break; + case STRICT_ARRAY: + amfData = new AmfArray(); + break; + default: + throw new IOException("Unknown/unimplemented AMF data type: " + amfType); + } + } else { + throw new IOException("Unknown AMF data type"); + } + + amfData.readFrom(in); + return amfData; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfMap.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfMap.java new file mode 100644 index 0000000..af33b94 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfMap.java @@ -0,0 +1,53 @@ +package com.github.faucamp.simplertmp.amf; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Map; + +import com.github.faucamp.simplertmp.Util; + +/** + * AMF map; that is, an "object"-like structure of key/value pairs, but with + * an array-like size indicator at the start (which is seemingly always 0) + * + * @author francois + */ +public class AmfMap extends AmfObject { + + @Override + public void writeTo(OutputStream out) throws IOException { + // Begin the map/object/array/whatever exactly this is + out.write(AmfType.ECMA_MAP.getValue()); + + // Write the "array size" + Util.writeUnsignedInt32(out, properties.size()); + + // Write key/value pairs in this object + for (Map.Entry entry : properties.entrySet()) { + // The key must be a STRING type, and thus the "type-definition" byte is implied (not included in message) + AmfString.writeStringTo(out, entry.getKey(), true); + entry.getValue().writeTo(out); + } + + // End the object + out.write(OBJECT_END_MARKER); + } + + @Override + public void readFrom(InputStream in) throws IOException { + // Skip data type byte (we assume it's already read) + int length = Util.readUnsignedInt32(in); // Seems this is always 0 + super.readFrom(in); + size += 4; // Add the bytes read for parsing the array size (length) + } + + @Override + public int getSize() { + if (size == -1) { + size = super.getSize(); + size += 4; // array length bytes + } + return size; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfNull.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfNull.java new file mode 100644 index 0000000..7df4bbb --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfNull.java @@ -0,0 +1,34 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.github.faucamp.simplertmp.amf; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * @author francois + */ +public class AmfNull implements AmfData { + + @Override + public void writeTo(OutputStream out) throws IOException { + out.write(AmfType.NULL.getValue()); + } + + @Override + public void readFrom(InputStream in) { + // Skip data type byte (we assume it's already read) + } + + public static void writeNullTo(OutputStream out) throws IOException { + out.write(AmfType.NULL.getValue()); + } + + @Override + public int getSize() { + return 1; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfNumber.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfNumber.java new file mode 100644 index 0000000..0fad4f7 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfNumber.java @@ -0,0 +1,62 @@ +package com.github.faucamp.simplertmp.amf; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.github.faucamp.simplertmp.Util; + +/** + * AMF0 Number data type + * + * @author francois + */ +public class AmfNumber implements AmfData { + + private double value; + /** Size of an AMF number, in bytes (including type bit) */ + public static final int SIZE = 9; + + public AmfNumber(double value) { + this.value = value; + } + + public AmfNumber() { + } + + public double getValue() { + return value; + } + + public void setValue(double value) { + this.value = value; + } + + @Override + public void writeTo(OutputStream out) throws IOException { + out.write(AmfType.NUMBER.getValue()); + Util.writeDouble(out, value); + } + + @Override + public void readFrom(InputStream in) throws IOException { + // Skip data type byte (we assume it's already read) + value = Util.readDouble(in); + } + + public static double readNumberFrom(InputStream in) throws IOException { + // Skip data type byte + in.read(); + return Util.readDouble(in); + } + + public static void writeNumberTo(OutputStream out, double number) throws IOException { + out.write(AmfType.NUMBER.getValue()); + Util.writeDouble(out, number); + } + + @Override + public int getSize() { + return SIZE; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfObject.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfObject.java new file mode 100644 index 0000000..20dbfdf --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfObject.java @@ -0,0 +1,109 @@ +package com.github.faucamp.simplertmp.amf; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * AMF object + * + * @author francois + */ +public class AmfObject implements AmfData { + + Map properties = new LinkedHashMap(); + protected int size = -1; + /** Byte sequence that marks the end of an AMF object */ + protected static final byte[] OBJECT_END_MARKER = new byte[] { 0x00, 0x00, 0x09 }; + + public AmfObject() { + } + + public AmfData getProperty(String key) { + return properties.get(key); + } + + public void setProperty(String key, AmfData value) { + properties.put(key, value); + } + + public void setProperty(String key, boolean value) { + properties.put(key, new AmfBoolean(value)); + } + + public void setProperty(String key, String value) { + properties.put(key, new AmfString(value, false)); + } + + public void setProperty(String key, int value) { + properties.put(key, new AmfNumber(value)); + } + + public void setProperty(String key, double value) { + properties.put(key, new AmfNumber(value)); + } + + @Override + public void writeTo(OutputStream out) throws IOException { + // Begin the object + out.write(AmfType.OBJECT.getValue()); + + // Write key/value pairs in this object + for (Map.Entry entry : properties.entrySet()) { + // The key must be a STRING type, and thus the "type-definition" byte is implied (not included in message) + AmfString.writeStringTo(out, entry.getKey(), true); + entry.getValue().writeTo(out); + } + + // End the object + out.write(OBJECT_END_MARKER); + } + + @Override + public void readFrom(InputStream in) throws IOException { + // Skip data type byte (we assume it's already read) + size = 1; + InputStream markInputStream = in.markSupported() ? in : new BufferedInputStream(in); + + while (true) { + // Look for the 3-byte object end marker [0x00 0x00 0x09] + markInputStream.mark(3); + byte[] endMarker = new byte[3]; + markInputStream.read(endMarker); + + if (endMarker[0] == OBJECT_END_MARKER[0] + && endMarker[1] == OBJECT_END_MARKER[1] + && endMarker[2] == OBJECT_END_MARKER[2]) { + // End marker found + size += 3; + return; + } else { + // End marker not found; reset the stream to the marked position and read an AMF property + markInputStream.reset(); + // Read the property key... + String key = AmfString.readStringFrom(in, true); + size += AmfString.sizeOf(key, true); + // ...and the property value + AmfData value = AmfDecoder.readFrom(markInputStream); + size += value.getSize(); + properties.put(key, value); + } + } + } + + @Override + public int getSize() { + if (size == -1) { + size = 1; // object marker + for (Map.Entry entry : properties.entrySet()) { + size += AmfString.sizeOf(entry.getKey(), true); + size += entry.getValue().getSize(); + } + size += 3; // end of object marker + } + return size; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfString.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfString.java new file mode 100644 index 0000000..580e73a --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfString.java @@ -0,0 +1,130 @@ +package com.github.faucamp.simplertmp.amf; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.lang.String; + +import android.util.Log; + +import com.github.faucamp.simplertmp.Util; + +/** + * @author francois + */ +public class AmfString implements AmfData { + + private static final String TAG = "AmfString"; + + private String value; + private boolean key; + private int size = -1; + + public AmfString() { + } + + public AmfString(String value, boolean isKey) { + this.value = value; + this.key = isKey; + } + + public AmfString(String value) { + this(value, false); + } + + public AmfString(boolean isKey) { + this.key = isKey; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public boolean isKey() { + return key; + } + + public void setKey(boolean key) { + this.key = key; + } + + @Override + public void writeTo(OutputStream out) throws IOException { + // Strings are ASCII encoded + byte[] byteValue = this.value.getBytes("ASCII"); + // Write the STRING data type definition (except if this String is used as a key) + if (!key) { + out.write(AmfType.STRING.getValue()); + } + // Write 2 bytes indicating string length + Util.writeUnsignedInt16(out, byteValue.length); + // Write string + out.write(byteValue); + } + + @Override + public void readFrom(InputStream in) throws IOException { + // Skip data type byte (we assume it's already read) + int length = Util.readUnsignedInt16(in); + size = 3 + length; // 1 + 2 + length + // Read string value + byte[] byteValue = new byte[length]; + Util.readBytesUntilFull(in, byteValue); + value = new String(byteValue, "ASCII"); + } + + public static String readStringFrom(InputStream in, boolean isKey) throws IOException { + if (!isKey) { + // Read past the data type byte + in.read(); + } + int length = Util.readUnsignedInt16(in); + // Read string value + byte[] byteValue = new byte[length]; + Util.readBytesUntilFull(in, byteValue); + return new String(byteValue, "ASCII"); + } + + public static void writeStringTo(OutputStream out, String string, boolean isKey) + throws IOException { + // Strings are ASCII encoded + byte[] byteValue = string.getBytes("ASCII"); + // Write the STRING data type definition (except if this String is used as a key) + if (!isKey) { + out.write(AmfType.STRING.getValue()); + } + // Write 2 bytes indicating string length + Util.writeUnsignedInt16(out, byteValue.length); + // Write string + out.write(byteValue); + } + + @Override + public int getSize() { + if (size == -1) { + try { + size = (isKey() ? 0 : 1) + 2 + value.getBytes("ASCII").length; + } catch (UnsupportedEncodingException ex) { + Log.e(TAG, "AmfString.getSize(): caught exception", ex); + throw new RuntimeException(ex); + } + } + return size; + } + + /** @return the byte size of the resulting AMF string of the specified value */ + public static int sizeOf(String string, boolean isKey) { + try { + int size = (isKey ? 0 : 1) + 2 + string.getBytes("ASCII").length; + return size; + } catch (UnsupportedEncodingException ex) { + Log.e(TAG, "AmfString.SizeOf(): caught exception", ex); + throw new RuntimeException(ex); + } + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfType.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfType.java new file mode 100644 index 0000000..7549555 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfType.java @@ -0,0 +1,39 @@ +package com.github.faucamp.simplertmp.amf; + +import java.util.HashMap; +import java.util.Map; + +/** + * AMF0 data type enum + * + * @author francois + */ +public enum AmfType { + + /** Number (encoded as IEEE 64-bit double precision floating point number) */ + NUMBER(0x00), /** Boolean (Encoded as a single byte of value 0x00 or 0x01) */ + BOOLEAN(0x01), /** String (ASCII encoded) */ + STRING(0x02), /** Object - set of key/value pairs */ + OBJECT(0x03), NULL(0x05), UNDEFINED(0x06), ECMA_MAP(0x08), STRICT_ARRAY(0x0A); + + private byte value; + private static final Map quickLookupMap = new HashMap<>(); + + static { + for (AmfType amfType : AmfType.values()) { + quickLookupMap.put(amfType.getValue(), amfType); + } + } + + private AmfType(int intValue) { + this.value = (byte) intValue; + } + + public byte getValue() { + return value; + } + + public static AmfType valueOf(byte amfTypeByte) { + return quickLookupMap.get(amfTypeByte); + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfUndefined.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfUndefined.java new file mode 100644 index 0000000..3be2179 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/amf/AmfUndefined.java @@ -0,0 +1,34 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.github.faucamp.simplertmp.amf; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * @author leoma + */ +public class AmfUndefined implements AmfData { + + @Override + public void writeTo(OutputStream out) throws IOException { + out.write(AmfType.UNDEFINED.getValue()); + } + + @Override + public void readFrom(InputStream in) { + // Skip data type byte (we assume it's already read) + } + + public static void writeUndefinedTo(OutputStream out) throws IOException { + out.write(AmfType.UNDEFINED.getValue()); + } + + @Override + public int getSize() { + return 1; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/io/ChunkStreamInfo.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/io/ChunkStreamInfo.java new file mode 100644 index 0000000..8c52c3f --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/io/ChunkStreamInfo.java @@ -0,0 +1,91 @@ +package com.github.faucamp.simplertmp.io; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.github.faucamp.simplertmp.Util; +import com.github.faucamp.simplertmp.packets.RtmpHeader; + +/** + * Chunk stream channel information + * + * @author francois, leo + */ +public class ChunkStreamInfo { + + public static final byte RTMP_CID_PROTOCOL_CONTROL = 0x02; + public static final byte RTMP_CID_OVER_CONNECTION = 0x03; + public static final byte RTMP_CID_OVER_CONNECTION2 = 0x04; + public static final byte RTMP_CID_OVER_STREAM = 0x05; + public static final byte RTMP_CID_VIDEO = 0x06; + public static final byte RTMP_CID_AUDIO = 0x07; + private RtmpHeader prevHeaderRx; + private RtmpHeader prevHeaderTx; + private static long sessionBeginTimestamp; + private long realLastTimestamp = System.nanoTime() / 1000000; // Do not use wall time! + private ByteArrayOutputStream baos = new ByteArrayOutputStream(1024 * 128); + + /** @return the previous header that was received on this channel, or null if no previous header was received */ + public RtmpHeader prevHeaderRx() { + return prevHeaderRx; + } + + /** Sets the previous header that was received on this channel, or null if no previous header was sent */ + public void setPrevHeaderRx(RtmpHeader previousHeader) { + this.prevHeaderRx = previousHeader; + } + + /** @return the previous header that was transmitted on this channel */ + public RtmpHeader getPrevHeaderTx() { + return prevHeaderTx; + } + + public boolean canReusePrevHeaderTx(RtmpHeader.MessageType forMessageType) { + return (prevHeaderTx != null && prevHeaderTx.getMessageType() == forMessageType); + } + + /** Sets the previous header that was transmitted on this channel */ + public void setPrevHeaderTx(RtmpHeader prevHeaderTx) { + this.prevHeaderTx = prevHeaderTx; + } + + /** Sets the session beginning timestamp for all chunks */ + public static void markSessionTimestampTx() { + sessionBeginTimestamp = System.nanoTime() / 1000000; + } + + /** Utility method for calculating & synchronizing transmitted timestamps */ + public long markAbsoluteTimestampTx() { + return System.nanoTime() / 1000000 - sessionBeginTimestamp; + } + + /** Utility method for calculating & synchronizing transmitted timestamp deltas */ + public long markDeltaTimestampTx() { + long currentTimestamp = System.nanoTime() / 1000000; + long diffTimestamp = currentTimestamp - realLastTimestamp; + realLastTimestamp = currentTimestamp; + return diffTimestamp; + } + + /** @return true if all packet data has been stored, or false if not */ + public boolean storePacketChunk(InputStream in, int chunkSize) throws IOException { + final int remainingBytes = prevHeaderRx.getPacketLength() - baos.size(); + byte[] chunk = new byte[Math.min(remainingBytes, chunkSize)]; + Util.readBytesUntilFull(in, chunk); + baos.write(chunk); + return (baos.size() == prevHeaderRx.getPacketLength()); + } + + public ByteArrayInputStream getStoredPacketInputStream() { + ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray()); + baos.reset(); + return bis; + } + + /** Clears all currently-stored packet chunks (used when an ABORT packet is received) */ + public void clearStoredChunks() { + baos.reset(); + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/io/RtmpConnection.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/io/RtmpConnection.java new file mode 100644 index 0000000..7125b26 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/io/RtmpConnection.java @@ -0,0 +1,695 @@ +package com.github.faucamp.simplertmp.io; + +import android.util.Log; + +import com.github.faucamp.simplertmp.RtmpPublisher; +import com.github.faucamp.simplertmp.Util; +import com.github.faucamp.simplertmp.amf.AmfMap; +import com.github.faucamp.simplertmp.amf.AmfNull; +import com.github.faucamp.simplertmp.amf.AmfNumber; +import com.github.faucamp.simplertmp.amf.AmfObject; +import com.github.faucamp.simplertmp.amf.AmfString; +import com.github.faucamp.simplertmp.packets.Abort; +import com.github.faucamp.simplertmp.packets.Audio; +import com.github.faucamp.simplertmp.packets.Command; +import com.github.faucamp.simplertmp.packets.Data; +import com.github.faucamp.simplertmp.packets.Handshake; +import com.github.faucamp.simplertmp.packets.RtmpPacket; +import com.github.faucamp.simplertmp.packets.SetPeerBandwidth; +import com.github.faucamp.simplertmp.packets.UserControl; +import com.github.faucamp.simplertmp.packets.Video; +import com.github.faucamp.simplertmp.packets.WindowAckSize; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketAddress; +import java.net.SocketException; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import net.ossrs.rtmp.BitrateManager; +import net.ossrs.rtmp.ConnectCheckerRtmp; +import net.ossrs.rtmp.CreateSSLSocket; + +/** + * Main RTMP connection implementation class + * + * @author francois, leoma, pedro + */ +public class RtmpConnection implements RtmpPublisher { + + private static final String TAG = "RtmpConnection"; + private static final Pattern rtmpUrlPattern = + Pattern.compile("^rtmps?://([^/:]+)(?::(\\d+))*/([^/]+)/?([^*]*)$"); + + private int port; + private String host; + private String appName; + private String streamName; + private String publishType; + private String swfUrl; + private String tcUrl; + private String pageUrl; + private Socket socket; + private RtmpSessionInfo rtmpSessionInfo; + private RtmpDecoder rtmpDecoder; + private BufferedInputStream inputStream; + private BufferedOutputStream outputStream; + private Thread rxPacketHandler; + private volatile boolean connected = false; + private volatile boolean publishPermitted = false; + private final Object connectingLock = new Object(); + private final Object publishLock = new Object(); + private int currentStreamId = 0; + private int transactionIdCounter = 0; + private int videoWidth; + private int videoHeight; + private ConnectCheckerRtmp connectCheckerRtmp; + //for secure transport + private boolean tlsEnabled; + //for auth + private String user = null; + private String password = null; + private String salt = null; + private String challenge = null; + private String opaque = null; + private boolean onAuth = false; + private String netConnectionDescription; + private BitrateManager bitrateManager; + + public RtmpConnection(ConnectCheckerRtmp connectCheckerRtmp) { + this.connectCheckerRtmp = connectCheckerRtmp; + bitrateManager = new BitrateManager(connectCheckerRtmp); + } + + private void handshake(InputStream in, OutputStream out) throws IOException { + Handshake handshake = new Handshake(); + handshake.writeC0(out); + handshake.writeC1(out); // Write C1 without waiting for S0 + out.flush(); + handshake.readS0(in); + handshake.readS1(in); + handshake.writeC2(out); + out.flush(); + handshake.readS2(in); + } + + @Override + public boolean connect(String url) { + Matcher rtmpMatcher = rtmpUrlPattern.matcher(url); + if (rtmpMatcher.matches()) { + tlsEnabled = rtmpMatcher.group(0).startsWith("rtmps"); + } else { + connectCheckerRtmp.onConnectionFailedRtmp( + "Endpoint malformed, should be: rtmp://ip:port/appname/streamname"); + return false; + } + + swfUrl = ""; + pageUrl = ""; + host = rtmpMatcher.group(1); + String portStr = rtmpMatcher.group(2); + port = portStr != null ? Integer.parseInt(portStr) : 1935; + appName = rtmpMatcher.group(3); + streamName = rtmpMatcher.group(4); + tcUrl = rtmpMatcher.group(0).substring(0, rtmpMatcher.group(0).length() - streamName.length()); + + // socket connection + Log.d(TAG, "connect() called. Host: " + + host + + ", port: " + + port + + ", appName: " + + appName + + ", publishPath: " + + streamName); + rtmpSessionInfo = new RtmpSessionInfo(); + rtmpDecoder = new RtmpDecoder(rtmpSessionInfo); + try { + if (!tlsEnabled) { + socket = new Socket(); + SocketAddress socketAddress = new InetSocketAddress(host, port); + socket.connect(socketAddress, 5000); + } else { + socket = CreateSSLSocket.createSSlSocket(host, port); + if (socket == null) throw new IOException("Socket creation failed"); + } + inputStream = new BufferedInputStream(socket.getInputStream()); + outputStream = new BufferedOutputStream(socket.getOutputStream()); + Log.d(TAG, "connect(): socket connection established, doing handhake..."); + handshake(inputStream, outputStream); + Log.d(TAG, "connect(): handshake done"); + } catch (IOException e) { + Log.e(TAG, "Error", e); + connectCheckerRtmp.onConnectionFailedRtmp("Connect error, " + e.getMessage()); + return false; + } + + // Start the "main" handling thread + rxPacketHandler = new Thread(new Runnable() { + + @Override + public void run() { + Log.d(TAG, "starting main rx handler loop"); + handleRxPacketLoop(); + } + }); + rxPacketHandler.start(); + return rtmpConnect(); + } + + private boolean rtmpConnect() { + if (connected) { + connectCheckerRtmp.onConnectionFailedRtmp("Already connected"); + return false; + } + + if (user != null && password != null) { + sendConnect("?authmod=adobe&user=" + user); + } else { + sendConnect(""); + } + synchronized (connectingLock) { + try { + connectingLock.wait(5000); + } catch (InterruptedException ex) { + // do nothing + } + } + if (!connected) { + shutdown(true); + connectCheckerRtmp.onConnectionFailedRtmp("Fail to connect, time out"); + } + return connected; + } + + private void sendConnect(String user) { + ChunkStreamInfo.markSessionTimestampTx(); + Log.d(TAG, "rtmpConnect(): Building 'connect' invoke packet"); + ChunkStreamInfo chunkStreamInfo = + rtmpSessionInfo.getChunkStreamInfo(ChunkStreamInfo.RTMP_CID_OVER_STREAM); + Command invoke = new Command("connect", ++transactionIdCounter, chunkStreamInfo); + invoke.getHeader().setMessageStreamId(0); + AmfObject args = new AmfObject(); + args.setProperty("app", appName + user); + args.setProperty("flashVer", "FMLE/3.0 (compatible; Lavf57.56.101)"); + args.setProperty("swfUrl", swfUrl); + args.setProperty("tcUrl", tcUrl + user); + args.setProperty("fpad", false); + args.setProperty("capabilities", 239); + args.setProperty("audioCodecs", 3191); + args.setProperty("videoCodecs", 252); + args.setProperty("videoFunction", 1); + args.setProperty("pageUrl", pageUrl); + args.setProperty("objectEncoding", 0); + invoke.addData(args); + sendRtmpPacket(invoke); + } + + private String getAuthUserResult(String user, String password, String salt, + String challenge, String opaque) { + String challenge2 = String.format("%08x", new Random().nextInt()); + String response = Util.stringToMD5BASE64(user + salt + password); + if (!opaque.isEmpty()) { + response += opaque; + } else if (!challenge.isEmpty()) { + response += challenge; + } + response = Util.stringToMD5BASE64(response + challenge2); + String result = + "?authmod=adobe&user=" + user + "&challenge=" + challenge2 + "&response=" + response; + if (!opaque.isEmpty()) { + result += "&opaque=" + opaque; + } + return result; + } + + @Override + public boolean publish(String type) { + if (type == null) { + connectCheckerRtmp.onConnectionFailedRtmp("Null publish type"); + return false; + } + publishType = type; + return createStream(); + } + + private boolean createStream() { + if (!connected || currentStreamId != 0) { + connectCheckerRtmp.onConnectionFailedRtmp( + "Create stream failed, connected= " + connected + ", StreamId= " + currentStreamId); + return false; + } + netConnectionDescription = null; + + Log.d(TAG, "createStream(): Sending releaseStream command..."); + // transactionId == 2 + Command releaseStream = new Command("releaseStream", ++transactionIdCounter); + releaseStream.getHeader().setChunkStreamId(ChunkStreamInfo.RTMP_CID_OVER_STREAM); + releaseStream.addData(new AmfNull()); // command object: null for "createStream" + releaseStream.addData(streamName); // command object: null for "releaseStream" + sendRtmpPacket(releaseStream); + + Log.d(TAG, "createStream(): Sending FCPublish command..."); + // transactionId == 3 + Command FCPublish = new Command("FCPublish", ++transactionIdCounter); + FCPublish.getHeader().setChunkStreamId(ChunkStreamInfo.RTMP_CID_OVER_STREAM); + FCPublish.addData(new AmfNull()); // command object: null for "FCPublish" + FCPublish.addData(streamName); + sendRtmpPacket(FCPublish); + + Log.d(TAG, "createStream(): Sending createStream command..."); + ChunkStreamInfo chunkStreamInfo = + rtmpSessionInfo.getChunkStreamInfo(ChunkStreamInfo.RTMP_CID_OVER_CONNECTION); + // transactionId == 4 + Command createStream = new Command("createStream", ++transactionIdCounter, chunkStreamInfo); + createStream.addData(new AmfNull()); // command object: null for "createStream" + sendRtmpPacket(createStream); + + // Waiting for "NetStream.Publish.Start" response. + synchronized (publishLock) { + try { + publishLock.wait(5000); + } catch (InterruptedException ex) { + // do nothing + } + } + if (!publishPermitted) { + shutdown(true); + if (netConnectionDescription != null && !netConnectionDescription.isEmpty()) { + connectCheckerRtmp.onConnectionFailedRtmp(netConnectionDescription); + } else { + connectCheckerRtmp.onConnectionFailedRtmp( + "Error configure stream, publish permitted failed"); + } + } + return publishPermitted; + } + + private void fmlePublish() { + if (!connected || currentStreamId == 0) { + Log.e(TAG, "fmlePublish failed"); + return; + } + + Log.d(TAG, "fmlePublish(): Sending publish command..."); + Command publish = new Command("publish", 0); + publish.getHeader().setChunkStreamId(ChunkStreamInfo.RTMP_CID_OVER_STREAM); + publish.getHeader().setMessageStreamId(currentStreamId); + publish.addData(new AmfNull()); // command object: null for "publish" + publish.addData(streamName); + publish.addData(publishType); + sendRtmpPacket(publish); + } + + private void onMetaData() { + if (!connected || currentStreamId == 0) { + Log.e(TAG, "onMetaData failed"); + return; + } + + Log.d(TAG, "onMetaData(): Sending empty onMetaData..."); + Data metadata = new Data("@setDataFrame"); + metadata.getHeader().setMessageStreamId(currentStreamId); + metadata.addData("onMetaData"); + AmfMap ecmaArray = new AmfMap(); + ecmaArray.setProperty("duration", 0); + ecmaArray.setProperty("width", videoWidth); + ecmaArray.setProperty("height", videoHeight); + ecmaArray.setProperty("videocodecid", 7); + ecmaArray.setProperty("framerate", 30); + ecmaArray.setProperty("videodatarate", 0); + // @see FLV video_file_format_spec_v10_1.pdf + // According to E.4.2.1 AUDIODATA + // "If the SoundFormat indicates AAC, the SoundType should be 1 (stereo) and the SoundRate should be 3 (44 kHz). + // However, this does not mean that AAC audio in FLV is always stereo, 44 kHz data. Instead, the Flash Player ignores + // these values and extracts the channel and sample rate data is encoded in the AAC bit stream." + ecmaArray.setProperty("audiocodecid", 10); + ecmaArray.setProperty("audiosamplerate", 44100); + ecmaArray.setProperty("audiosamplesize", 16); + ecmaArray.setProperty("audiodatarate", 0); + ecmaArray.setProperty("stereo", true); + ecmaArray.setProperty("filesize", 0); + metadata.addData(ecmaArray); + sendRtmpPacket(metadata); + } + + @Override + public void close() { + if (socket != null) { + closeStream(); + } + shutdown(true); + } + + private void closeStream() { + if (!connected || currentStreamId == 0 || !publishPermitted) { + Log.e(TAG, "closeStream failed"); + return; + } + Log.d(TAG, "closeStream(): setting current stream ID to 0"); + Command closeStream = new Command("closeStream", 0); + closeStream.getHeader().setChunkStreamId(ChunkStreamInfo.RTMP_CID_OVER_STREAM); + closeStream.getHeader().setMessageStreamId(currentStreamId); + closeStream.addData(new AmfNull()); + sendRtmpPacket(closeStream); + } + + private synchronized void shutdown(boolean r) { + if (socket != null) { + try { + // It will raise EOFException in handleRxPacketThread + socket.shutdownInput(); + // It will raise SocketException in sendRtmpPacket + socket.shutdownOutput(); + } catch (IOException | UnsupportedOperationException e) { + Log.e(TAG, "Shutdown socket", e); + } + + // shutdown rxPacketHandler + if (rxPacketHandler != null) { + rxPacketHandler.interrupt(); + try { + rxPacketHandler.join(100); + } catch (InterruptedException ie) { + rxPacketHandler.interrupt(); + } + rxPacketHandler = null; + } + + // shutdown socket as well as its input and output stream + try { + socket.close(); + Log.d(TAG, "socket closed"); + } catch (IOException ex) { + Log.e(TAG, "shutdown(): failed to close socket", ex); + } + } + + if (r) { + reset(); + } + } + + private void reset() { + connected = false; + publishPermitted = false; + netConnectionDescription = null; + tcUrl = null; + swfUrl = null; + pageUrl = null; + appName = null; + streamName = null; + publishType = null; + currentStreamId = 0; + transactionIdCounter = 0; + socket = null; + rtmpSessionInfo = null; + user = null; + password = null; + salt = null; + challenge = null; + opaque = null; + } + + @Override + public void publishAudioData(byte[] data, int size, int dts) { + if (data == null + || data.length == 0 + || dts < 0 + || !connected + || currentStreamId == 0 + || !publishPermitted) { + return; + } + Audio audio = new Audio(); + audio.setData(data, size); + audio.getHeader().setAbsoluteTimestamp(dts); + audio.getHeader().setMessageStreamId(currentStreamId); + sendRtmpPacket(audio); + //bytes to bits + bitrateManager.calculateBitrate(size * 8); + } + + @Override + public void publishVideoData(byte[] data, int size, int dts) { + if (data == null + || data.length == 0 + || dts < 0 + || !connected + || currentStreamId == 0 + || !publishPermitted) { + return; + } + Video video = new Video(); + video.setData(data, size); + video.getHeader().setAbsoluteTimestamp(dts); + video.getHeader().setMessageStreamId(currentStreamId); + sendRtmpPacket(video); + //bytes to bits + bitrateManager.calculateBitrate(size * 8); + } + + private void sendRtmpPacket(RtmpPacket rtmpPacket) { + try { + ChunkStreamInfo chunkStreamInfo = + rtmpSessionInfo.getChunkStreamInfo(rtmpPacket.getHeader().getChunkStreamId()); + chunkStreamInfo.setPrevHeaderTx(rtmpPacket.getHeader()); + if (!(rtmpPacket instanceof Video || rtmpPacket instanceof Audio)) { + rtmpPacket.getHeader() + .setAbsoluteTimestamp((int) chunkStreamInfo.markAbsoluteTimestampTx()); + } + rtmpPacket.writeTo(outputStream, rtmpSessionInfo.getTxChunkSize(), chunkStreamInfo); + Log.d(TAG, + "wrote packet: " + rtmpPacket + ", size: " + rtmpPacket.getHeader().getPacketLength()); + if (rtmpPacket instanceof Command) { + rtmpSessionInfo.addInvokedCommand(((Command) rtmpPacket).getTransactionId(), + ((Command) rtmpPacket).getCommandName()); + } + outputStream.flush(); + } catch (SocketException ignored) { + } catch (IOException ioe) { + connectCheckerRtmp.onConnectionFailedRtmp("Error send packet: " + ioe.getMessage()); + Log.e(TAG, "Caught IOException during write loop, shutting down: " + ioe.getMessage()); + Thread.currentThread().interrupt(); + } + } + + private void handleRxPacketLoop() { + // Handle all queued received RTMP packets + while (!Thread.interrupted()) { + try { + // It will be blocked when no data in input stream buffer + RtmpPacket rtmpPacket = rtmpDecoder.readPacket(inputStream); + if (rtmpPacket != null) { + //Log.d(TAG, "handleRxPacketLoop(): RTMP rx packet message type: " + rtmpPacket.getHeader().getMessageType()); + switch (rtmpPacket.getHeader().getMessageType()) { + case ABORT: + rtmpSessionInfo.getChunkStreamInfo(((Abort) rtmpPacket).getChunkStreamId()) + .clearStoredChunks(); + break; + case USER_CONTROL_MESSAGE: + UserControl user = (UserControl) rtmpPacket; + switch (user.getType()) { + case STREAM_BEGIN: + break; + case PING_REQUEST: + ChunkStreamInfo channelInfo = + rtmpSessionInfo.getChunkStreamInfo(ChunkStreamInfo.RTMP_CID_PROTOCOL_CONTROL); + Log.d(TAG, "handleRxPacketLoop(): Sending PONG reply.."); + UserControl pong = new UserControl(user, channelInfo); + sendRtmpPacket(pong); + break; + case STREAM_EOF: + Log.i(TAG, "handleRxPacketLoop(): Stream EOF reached, closing RTMP writer..."); + break; + default: + // Ignore... + break; + } + break; + case WINDOW_ACKNOWLEDGEMENT_SIZE: + WindowAckSize windowAckSize = (WindowAckSize) rtmpPacket; + int size = windowAckSize.getAcknowledgementWindowSize(); + Log.d(TAG, "handleRxPacketLoop(): Setting acknowledgement window size: " + size); + rtmpSessionInfo.setAcknowledgmentWindowSize(size); + break; + case SET_PEER_BANDWIDTH: + rtmpSessionInfo.setAcknowledgmentWindowSize(socket.getSendBufferSize()); + int acknowledgementWindowsize = rtmpSessionInfo.getAcknowledgementWindowSize(); + ChunkStreamInfo chunkStreamInfo = + rtmpSessionInfo.getChunkStreamInfo(ChunkStreamInfo.RTMP_CID_PROTOCOL_CONTROL); + Log.d(TAG, "handleRxPacketLoop(): Send acknowledgement window size: " + + acknowledgementWindowsize); + sendRtmpPacket(new WindowAckSize(acknowledgementWindowsize, chunkStreamInfo)); + // Set socket option. This line could produce bps calculation problems. + socket.setSendBufferSize(acknowledgementWindowsize); + break; + case COMMAND_AMF0: + handleRxInvoke((Command) rtmpPacket); + break; + default: + Log.w(TAG, "handleRxPacketLoop(): Not handling unimplemented/unknown packet of type: " + + rtmpPacket.getHeader().getMessageType()); + break; + } + } + } catch (EOFException eof) { + Thread.currentThread().interrupt(); + } catch (IOException e) { + connectCheckerRtmp.onConnectionFailedRtmp("Error reading packet: " + e.getMessage()); + Log.e(TAG, "Caught SocketException while reading/decoding packet, shutting down: " + + e.getMessage()); + Thread.currentThread().interrupt(); + } + } + } + + private void handleRxInvoke(Command invoke) { + String commandName = invoke.getCommandName(); + switch (commandName) { + case "_error": + try { + String description = ((AmfString) ((AmfObject) invoke.getData().get(1)).getProperty( + "description")).getValue(); + Log.i(TAG, description); + if (description.contains("reason=authfailed")) { + connectCheckerRtmp.onAuthErrorRtmp(); + connected = false; + synchronized (connectingLock) { + connectingLock.notifyAll(); + } + } else if (user != null + && password != null + && description.contains("challenge=") + && description.contains("salt=")) { + onAuth = true; + try { + shutdown(false); + } catch (Exception e) { + e.printStackTrace(); + } + rtmpSessionInfo = new RtmpSessionInfo(); + rtmpDecoder = new RtmpDecoder(rtmpSessionInfo); + if (!tlsEnabled) { + socket = new Socket(host, port); + } else { + socket = CreateSSLSocket.createSSlSocket(host, port); + if (socket == null) throw new IOException("Socket creation failed"); + } + inputStream = new BufferedInputStream(socket.getInputStream()); + outputStream = new BufferedOutputStream(socket.getOutputStream()); + Log.d(TAG, "connect(): socket connection established, doing handshake..."); + salt = Util.getSalt(description); + challenge = Util.getChallenge(description); + opaque = Util.getOpaque(description); + handshake(inputStream, outputStream); + rxPacketHandler = new Thread(new Runnable() { + @Override + public void run() { + handleRxPacketLoop(); + } + }); + rxPacketHandler.start(); + sendConnect(getAuthUserResult(user, password, salt, challenge, opaque)); + } else if (description.contains("code=403") && user == null || password == null) { + connectCheckerRtmp.onAuthErrorRtmp(); + connected = false; + synchronized (connectingLock) { + connectingLock.notifyAll(); + } + } else { + connectCheckerRtmp.onConnectionFailedRtmp(description); + connected = false; + synchronized (connectingLock) { + connectingLock.notifyAll(); + } + } + } catch (Exception e) { + connectCheckerRtmp.onConnectionFailedRtmp(e.getMessage()); + connected = false; + synchronized (connectingLock) { + connectingLock.notifyAll(); + } + } + break; + case "_result": + // This is the result of one of the methods invoked by us + String method = rtmpSessionInfo.takeInvokedCommand(invoke.getTransactionId()); + + Log.i(TAG, "handleRxInvoke: Got result for invoked method: " + method); + if ("connect".equals(method)) { + if (onAuth) { + connectCheckerRtmp.onAuthSuccessRtmp(); + onAuth = false; + } + // Capture server ip/pid/id information if any + // We can now send createStream commands + connected = true; + synchronized (connectingLock) { + connectingLock.notifyAll(); + } + } else if ("createStream".contains(method)) { + // Get stream id + currentStreamId = (int) ((AmfNumber) invoke.getData().get(1)).getValue(); + Log.d(TAG, "handleRxInvoke(): Stream ID to publish: " + currentStreamId); + if (streamName != null && publishType != null) { + fmlePublish(); + } + } else if ("releaseStream".contains(method)) { + Log.d(TAG, "handleRxInvoke(): 'releaseStream'"); + } else if ("FCPublish".contains(method)) { + Log.d(TAG, "handleRxInvoke(): 'FCPublish'"); + } else { + Log.w(TAG, "handleRxInvoke(): '_result' message received for unknown method: " + method); + } + break; + case "onBWDone": + Log.d(TAG, "handleRxInvoke(): 'onBWDone'"); + break; + case "onFCPublish": + Log.d(TAG, "handleRxInvoke(): 'onFCPublish'"); + break; + case "onStatus": + String code = + ((AmfString) ((AmfObject) invoke.getData().get(1)).getProperty("code")).getValue(); + Log.d(TAG, "handleRxInvoke(): onStatus " + code); + if (code.equals("NetStream.Publish.Start")) { + onMetaData(); + // We can now publish AV data + publishPermitted = true; + synchronized (publishLock) { + publishLock.notifyAll(); + } + } else if (code.equals("NetConnection.Connect.Rejected")) { + netConnectionDescription = ((AmfString) ((AmfObject) invoke.getData().get(1)).getProperty( + "description")).getValue(); + publishPermitted = false; + synchronized (publishLock) { + publishLock.notifyAll(); + } + } + break; + default: + Log.e(TAG, "handleRxInvoke(): Unknown/unhandled server invoke: " + invoke); + break; + } + } + + @Override + public void setVideoResolution(int width, int height) { + videoWidth = width; + videoHeight = height; + } + + @Override + public void setAuthorization(String user, String password) { + this.user = user; + this.password = password; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/io/RtmpDecoder.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/io/RtmpDecoder.java new file mode 100644 index 0000000..fd82cf6 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/io/RtmpDecoder.java @@ -0,0 +1,96 @@ +package com.github.faucamp.simplertmp.io; + +import java.io.IOException; +import java.io.InputStream; + +import android.util.Log; + +import com.github.faucamp.simplertmp.packets.Abort; +import com.github.faucamp.simplertmp.packets.Audio; +import com.github.faucamp.simplertmp.packets.Command; +import com.github.faucamp.simplertmp.packets.Data; +import com.github.faucamp.simplertmp.packets.RtmpHeader; +import com.github.faucamp.simplertmp.packets.RtmpPacket; +import com.github.faucamp.simplertmp.packets.SetChunkSize; +import com.github.faucamp.simplertmp.packets.SetPeerBandwidth; +import com.github.faucamp.simplertmp.packets.UserControl; +import com.github.faucamp.simplertmp.packets.Video; +import com.github.faucamp.simplertmp.packets.WindowAckSize; +import com.github.faucamp.simplertmp.packets.Acknowledgement; + +/** + * @author francois + */ +public class RtmpDecoder { + + private static final String TAG = "RtmpDecoder"; + + private RtmpSessionInfo rtmpSessionInfo; + + public RtmpDecoder(RtmpSessionInfo rtmpSessionInfo) { + this.rtmpSessionInfo = rtmpSessionInfo; + } + + public RtmpPacket readPacket(InputStream in) throws IOException { + + RtmpHeader header = RtmpHeader.readHeader(in, rtmpSessionInfo); + // Log.d(TAG, "readPacket(): header.messageType: " + header.getMessageType()); + + ChunkStreamInfo chunkStreamInfo = rtmpSessionInfo.getChunkStreamInfo(header.getChunkStreamId()); + chunkStreamInfo.setPrevHeaderRx(header); + + if (header.getPacketLength() > rtmpSessionInfo.getRxChunkSize()) { + // If the packet consists of more than one chunk, + // store the chunks in the chunk stream until everything is read + if (!chunkStreamInfo.storePacketChunk(in, rtmpSessionInfo.getRxChunkSize())) { + // return null because of incomplete packet + return null; + } else { + // stored chunks complete packet, get the input stream of the chunk stream + in = chunkStreamInfo.getStoredPacketInputStream(); + } + } + + RtmpPacket rtmpPacket; + switch (header.getMessageType()) { + case SET_CHUNK_SIZE: + SetChunkSize setChunkSize = new SetChunkSize(header); + setChunkSize.readBody(in); + Log.d(TAG, "readPacket(): Setting chunk size to: " + setChunkSize.getChunkSize()); + rtmpSessionInfo.setRxChunkSize(setChunkSize.getChunkSize()); + return null; + case ABORT: + rtmpPacket = new Abort(header); + break; + case USER_CONTROL_MESSAGE: + rtmpPacket = new UserControl(header); + break; + case WINDOW_ACKNOWLEDGEMENT_SIZE: + rtmpPacket = new WindowAckSize(header); + break; + case SET_PEER_BANDWIDTH: + rtmpPacket = new SetPeerBandwidth(header); + break; + case AUDIO: + rtmpPacket = new Audio(header); + break; + case VIDEO: + rtmpPacket = new Video(header); + break; + case COMMAND_AMF0: + rtmpPacket = new Command(header); + break; + case DATA_AMF0: + rtmpPacket = new Data(header); + break; + case ACKNOWLEDGEMENT: + rtmpPacket = new Acknowledgement(header); + break; + default: + throw new IOException( + "No packet body implementation for message type: " + header.getMessageType()); + } + rtmpPacket.readBody(in); + return rtmpPacket; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/io/RtmpSessionInfo.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/io/RtmpSessionInfo.java new file mode 100644 index 0000000..aa32cc7 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/io/RtmpSessionInfo.java @@ -0,0 +1,83 @@ +package com.github.faucamp.simplertmp.io; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.github.faucamp.simplertmp.packets.RtmpPacket; + +/** + * @author francois + */ +public class RtmpSessionInfo { + + /** The (total) number of bytes read for this window (resets to 0 if the agreed-upon RTMP window acknowledgement size is reached) */ + private int windowBytesRead; + /** The window acknowledgement size for this RTMP session, in bytes; default to max to avoid unnecessary "Acknowledgment" messages from being sent */ + private int acknowledgementWindowSize = Integer.MAX_VALUE; + /** Used internally to store the total number of bytes read (used when sending Acknowledgement messages) */ + private int totalBytesRead = 0; + + /** Default chunk size is 128 bytes */ + private int rxChunkSize = 128; + private int txChunkSize = 128; + private Map chunkChannels = new HashMap<>(); + private Map invokedMethods = new ConcurrentHashMap<>(); + + public ChunkStreamInfo getChunkStreamInfo(int chunkStreamId) { + ChunkStreamInfo chunkStreamInfo = chunkChannels.get(chunkStreamId); + if (chunkStreamInfo == null) { + chunkStreamInfo = new ChunkStreamInfo(); + chunkChannels.put(chunkStreamId, chunkStreamInfo); + } + return chunkStreamInfo; + } + + public String takeInvokedCommand(int transactionId) { + return invokedMethods.remove(transactionId); + } + + public String addInvokedCommand(int transactionId, String commandName) { + return invokedMethods.put(transactionId, commandName); + } + + public int getRxChunkSize() { + return rxChunkSize; + } + + public void setRxChunkSize(int chunkSize) { + this.rxChunkSize = chunkSize; + } + + public int getTxChunkSize() { + return txChunkSize; + } + + public void setTxChunkSize(int chunkSize) { + this.txChunkSize = chunkSize; + } + + public int getAcknowledgementWindowSize() { + return acknowledgementWindowSize; + } + + public void setAcknowledgmentWindowSize(int acknowledgementWindowSize) { + this.acknowledgementWindowSize = acknowledgementWindowSize; + } + + /** + * Add the specified amount of bytes to the total number of bytes read for this RTMP window; + * + * @param numBytes the number of bytes to add + * @return true if an "acknowledgement" packet should be sent, false otherwise + */ + public final void addToWindowBytesRead(final int numBytes, final RtmpPacket packet) + throws WindowAckRequired { + windowBytesRead += numBytes; + totalBytesRead += numBytes; + if (windowBytesRead >= acknowledgementWindowSize) { + windowBytesRead -= acknowledgementWindowSize; + throw new WindowAckRequired(totalBytesRead, packet); + } + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/io/WindowAckRequired.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/io/WindowAckRequired.java new file mode 100644 index 0000000..4431f36 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/io/WindowAckRequired.java @@ -0,0 +1,40 @@ +package com.github.faucamp.simplertmp.io; + +import com.github.faucamp.simplertmp.packets.RtmpPacket; + +/** + * Thrown by RTMP read thread when an Acknowledgement packet needs to be sent + * to acknowledge the RTMP window size. It contains the RTMP packet that was + * read when this event occurred (if any). + * + * @author francois + */ +public class WindowAckRequired extends Exception { + + private RtmpPacket rtmpPacket; + private int bytesRead; + + /** + * Used when the window acknowledgement size was reached, whilst fully reading + * an RTMP packet or not. If a packet is present, it should still be handled as if it was returned + * by the RTMP decoder. + * + * @param bytesReadThusFar The (total) number of bytes received so far + * @param rtmpPacket The packet that was read (and thus should be handled), can be null + */ + public WindowAckRequired(int bytesReadThusFar, RtmpPacket rtmpPacket) { + this.rtmpPacket = rtmpPacket; + this.bytesRead = bytesReadThusFar; + } + + /** + * @return The RTMP packet that should be handled, or null if no full packet is available + */ + public RtmpPacket getRtmpPacket() { + return rtmpPacket; + } + + public int getBytesRead() { + return bytesRead; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Abort.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Abort.java new file mode 100644 index 0000000..520f184 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Abort.java @@ -0,0 +1,59 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.github.faucamp.simplertmp.Util; +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; + +/** + * A "Abort" RTMP control message, received on chunk stream ID 2 (control channel) + * + * @author francois + */ +public class Abort extends RtmpPacket { + + private int chunkStreamId; + + public Abort(RtmpHeader header) { + super(header); + } + + public Abort(int chunkStreamId) { + super(new RtmpHeader(RtmpHeader.ChunkType.TYPE_1_RELATIVE_LARGE, + ChunkStreamInfo.RTMP_CID_PROTOCOL_CONTROL, RtmpHeader.MessageType.SET_CHUNK_SIZE)); + this.chunkStreamId = chunkStreamId; + } + + /** @return the ID of the chunk stream to be aborted */ + public int getChunkStreamId() { + return chunkStreamId; + } + + /** Sets the ID of the chunk stream to be aborted */ + public void setChunkStreamId(int chunkStreamId) { + this.chunkStreamId = chunkStreamId; + } + + @Override + public void readBody(InputStream in) throws IOException { + // Value is received in the 4 bytes of the body + chunkStreamId = Util.readUnsignedInt32(in); + } + + @Override + protected byte[] array() { + return null; + } + + @Override + protected int size() { + return 0; + } + + @Override + protected void writeBody(OutputStream out) throws IOException { + Util.writeUnsignedInt32(out, chunkStreamId); + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Acknowledgement.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Acknowledgement.java new file mode 100644 index 0000000..9f13b53 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Acknowledgement.java @@ -0,0 +1,75 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.github.faucamp.simplertmp.Util; +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; + +/** + * (Window) Acknowledgement + * + * The client or the server sends the acknowledgment to the peer after + * receiving bytes equal to the window size. The window size is the + * maximum number of bytes that the sender sends without receiving + * acknowledgment from the receiver. The server sends the window size to + * the client after application connects. This message specifies the + * sequence number, which is the number of the bytes received so far. + * + * @author francois + */ +public class Acknowledgement extends RtmpPacket { + + private int sequenceNumber; + + public Acknowledgement(RtmpHeader header) { + super(header); + } + + public Acknowledgement(int numBytesReadThusFar) { + super( + new RtmpHeader(RtmpHeader.ChunkType.TYPE_0_FULL, ChunkStreamInfo.RTMP_CID_PROTOCOL_CONTROL, + RtmpHeader.MessageType.ACKNOWLEDGEMENT)); + this.sequenceNumber = numBytesReadThusFar; + } + + public int getAcknowledgementWindowSize() { + return sequenceNumber; + } + + /** @return the sequence number, which is the number of the bytes received so far */ + public int getSequenceNumber() { + return sequenceNumber; + } + + /** Sets the sequence number, which is the number of the bytes received so far */ + public void setSequenceNumber(int numBytesRead) { + this.sequenceNumber = numBytesRead; + } + + @Override + public void readBody(InputStream in) throws IOException { + sequenceNumber = Util.readUnsignedInt32(in); + } + + @Override + protected void writeBody(OutputStream out) throws IOException { + Util.writeUnsignedInt32(out, sequenceNumber); + } + + @Override + protected byte[] array() { + return null; + } + + @Override + protected int size() { + return 0; + } + + @Override + public String toString() { + return "RTMP Acknowledgment (sequence number: " + sequenceNumber + ")"; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Audio.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Audio.java new file mode 100644 index 0000000..b436a7e --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Audio.java @@ -0,0 +1,25 @@ +package com.github.faucamp.simplertmp.packets; + +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; + +/** + * Audio data packet + * + * @author francois + */ +public class Audio extends ContentData { + + public Audio(RtmpHeader header) { + super(header); + } + + public Audio() { + super(new RtmpHeader(RtmpHeader.ChunkType.TYPE_0_FULL, ChunkStreamInfo.RTMP_CID_AUDIO, + RtmpHeader.MessageType.AUDIO)); + } + + @Override + public String toString() { + return "RTMP Audio"; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Command.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Command.java new file mode 100644 index 0000000..90122e0 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Command.java @@ -0,0 +1,94 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.github.faucamp.simplertmp.amf.AmfNumber; +import com.github.faucamp.simplertmp.amf.AmfString; +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; + +/** + * Encapsulates an command/"invoke" RTMP packet + * + * Invoke/command packet structure (AMF encoded): + * (String) + * (Number) + * (Mixed) ex. Null, String, Object: {key1:value1, key2:value2 ... } + * + * @author francois + */ +public class Command extends VariableBodyRtmpPacket { + + private static final String TAG = "Command"; + + private String commandName; + private int transactionId; + + public Command(RtmpHeader header) { + super(header); + } + + public Command(String commandName, int transactionId, ChunkStreamInfo channelInfo) { + super(new RtmpHeader((channelInfo.canReusePrevHeaderTx(RtmpHeader.MessageType.COMMAND_AMF0) + ? RtmpHeader.ChunkType.TYPE_1_RELATIVE_LARGE : RtmpHeader.ChunkType.TYPE_0_FULL), + ChunkStreamInfo.RTMP_CID_OVER_CONNECTION, RtmpHeader.MessageType.COMMAND_AMF0)); + this.commandName = commandName; + this.transactionId = transactionId; + } + + public Command(String commandName, int transactionId) { + super(new RtmpHeader(RtmpHeader.ChunkType.TYPE_0_FULL, ChunkStreamInfo.RTMP_CID_OVER_CONNECTION, + RtmpHeader.MessageType.COMMAND_AMF0)); + this.commandName = commandName; + this.transactionId = transactionId; + } + + public String getCommandName() { + return commandName; + } + + public void setCommandName(String commandName) { + this.commandName = commandName; + } + + public int getTransactionId() { + return transactionId; + } + + public void setTransactionId(int transactionId) { + this.transactionId = transactionId; + } + + @Override + public void readBody(InputStream in) throws IOException { + // The command name and transaction ID are always present (AMF string followed by number) + commandName = AmfString.readStringFrom(in, false); + transactionId = (int) AmfNumber.readNumberFrom(in); + int bytesRead = AmfString.sizeOf(commandName, false) + AmfNumber.SIZE; + readVariableData(in, bytesRead); + } + + @Override + protected void writeBody(OutputStream out) throws IOException { + AmfString.writeStringTo(out, commandName, false); + AmfNumber.writeNumberTo(out, transactionId); + // Write body data + writeVariableData(out); + } + + @Override + protected byte[] array() { + return null; + } + + @Override + protected int size() { + return 0; + } + + @Override + public String toString() { + return "RTMP Command (command: " + commandName + ", transaction ID: " + transactionId + ")"; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/ContentData.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/ContentData.java new file mode 100644 index 0000000..45a3754 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/ContentData.java @@ -0,0 +1,56 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.github.faucamp.simplertmp.Util; + +/** + * Content (audio/video) data packet base + * + * @author francois + */ +public abstract class ContentData extends RtmpPacket { + + protected byte[] data; + protected int size; + + public ContentData(RtmpHeader header) { + super(header); + } + + public byte[] getData() { + return data; + } + + public void setData(byte[] data, int size) { + this.data = data; + this.size = size; + } + + @Override + public void readBody(InputStream in) throws IOException { + data = new byte[this.header.getPacketLength()]; + Util.readBytesUntilFull(in, data); + } + + /** + * Method is public for content (audio/video) + * Write this packet body without chunking; + * useful for dumping audio/video streams + */ + @Override + public void writeBody(OutputStream out) { + } + + @Override + public byte[] array() { + return data; + } + + @Override + public int size() { + return size; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Data.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Data.java new file mode 100644 index 0000000..3fed7f8 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Data.java @@ -0,0 +1,71 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.github.faucamp.simplertmp.amf.AmfString; +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; + +/** + * AMF Data packet + * + * Also known as NOTIFY in some RTMP implementations. + * + * The client or the server sends this message to send Metadata or any user data + * to the peer. Metadata includes details about the data (audio, video etc.) + * like creation time, duration, theme and so on. + * + * @author francois + */ +public class Data extends VariableBodyRtmpPacket { + + private String type; + + public Data(RtmpHeader header) { + super(header); + } + + public Data(String type) { + super(new RtmpHeader(RtmpHeader.ChunkType.TYPE_0_FULL, ChunkStreamInfo.RTMP_CID_OVER_CONNECTION, + RtmpHeader.MessageType.DATA_AMF0)); + this.type = type; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @Override + public void readBody(InputStream in) throws IOException { + // Read notification type + type = AmfString.readStringFrom(in, false); + int bytesRead = AmfString.sizeOf(type, false); + // Read data body + readVariableData(in, bytesRead); + } + + /** + * This method is public for Data to make it easy to dump its contents to + * another output stream + */ + @Override + protected void writeBody(OutputStream out) throws IOException { + AmfString.writeStringTo(out, type, false); + writeVariableData(out); + } + + @Override + protected byte[] array() { + return null; + } + + @Override + protected int size() { + return 0; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Handshake.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Handshake.java new file mode 100644 index 0000000..497fc2b --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Handshake.java @@ -0,0 +1,225 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Random; + +import android.util.Log; + +import com.github.faucamp.simplertmp.Crypto; +import com.github.faucamp.simplertmp.Util; + +/** + * Handles the RTMP handshake song 'n dance + * + * Thanks to http://thompsonng.blogspot.com/2010/11/rtmp-part-10-handshake.html for some very useful information on + * the the hidden "features" of the RTMP handshake + * + * @author francois + */ +public final class Handshake { + private static final String TAG = "Handshake"; + /** S1 as sent by the server */ + private byte[] s1; + private static final int PROTOCOL_VERSION = 0x03; + private static final int HANDSHAKE_SIZE = 1536; + private static final int SHA256_DIGEST_SIZE = 32; + + private static final int DIGEST_OFFSET_INDICATOR_POS = 772; // should either be byte 772 or byte 8 + + private static final byte[] GENUINE_FP_KEY = { + (byte) 0x47, (byte) 0x65, (byte) 0x6E, (byte) 0x75, (byte) 0x69, (byte) 0x6E, (byte) 0x65, + (byte) 0x20, (byte) 0x41, (byte) 0x64, (byte) 0x6F, (byte) 0x62, (byte) 0x65, (byte) 0x20, + (byte) 0x46, (byte) 0x6C, (byte) 0x61, (byte) 0x73, (byte) 0x68, (byte) 0x20, (byte) 0x50, + (byte) 0x6C, (byte) 0x61, (byte) 0x79, (byte) 0x65, (byte) 0x72, (byte) 0x20, (byte) 0x30, + (byte) 0x30, (byte) 0x31, // Genuine Adobe Flash Player 001 + (byte) 0xF0, (byte) 0xEE, (byte) 0xC2, (byte) 0x4A, (byte) 0x80, (byte) 0x68, (byte) 0xBE, + (byte) 0xE8, (byte) 0x2E, (byte) 0x00, (byte) 0xD0, (byte) 0xD1, (byte) 0x02, (byte) 0x9E, + (byte) 0x7E, (byte) 0x57, (byte) 0x6E, (byte) 0xEC, (byte) 0x5D, (byte) 0x2D, (byte) 0x29, + (byte) 0x80, (byte) 0x6F, (byte) 0xAB, (byte) 0x93, (byte) 0xB8, (byte) 0xE6, (byte) 0x36, + (byte) 0xCF, (byte) 0xEB, (byte) 0x31, (byte) 0xAE + }; + + /** Generates and writes the first handshake packet (C0) */ + public final void writeC0(OutputStream out) throws IOException { + Log.d(TAG, "writeC0"); + out.write(PROTOCOL_VERSION); + } + + public final void readS0(InputStream in) throws IOException { + Log.d(TAG, "readS0"); + byte s0 = (byte) in.read(); + if (s0 != PROTOCOL_VERSION && s0 != 72) { //check 72 to fix Ant Media Server + if (s0 == -1) { + throw new IOException("InputStream closed"); + } else { + throw new IOException( + "Invalid RTMP protocol version; expected " + PROTOCOL_VERSION + ", got " + s0); + } + } + } + + /** Generates and writes the second handshake packet (C1) */ + public final void writeC1(OutputStream out) throws IOException { + Log.d(TAG, "writeC1"); + Log.d(TAG, "writeC1(): Calculating digest offset"); + Random random = new Random(); + // Since we are faking a real Flash Player handshake, include a digest in C1 + // Choose digest offset point (scheme 1; that is, offset is indicated by bytes 772 - 775 (4 bytes) ) + final int digestOffset = random.nextInt(HANDSHAKE_SIZE + - DIGEST_OFFSET_INDICATOR_POS + - 4 + - 8 + - SHA256_DIGEST_SIZE); //random.nextInt(DIGEST_OFFSET_INDICATOR_POS - SHA256_DIGEST_SIZE); + + final int absoluteDigestOffset = ((digestOffset % 728) + DIGEST_OFFSET_INDICATOR_POS + 4); + Log.d(TAG, "writeC1(): (real value of) digestOffset: " + digestOffset); + + Log.d(TAG, "writeC1(): recalculated digestOffset: " + absoluteDigestOffset); + + int remaining = digestOffset; + final byte[] digestOffsetBytes = new byte[4]; + for (int i = 3; i >= 0; i--) { + if (remaining > 255) { + digestOffsetBytes[i] = (byte) 255; + remaining -= 255; + } else { + digestOffsetBytes[i] = (byte) remaining; + remaining -= remaining; + } + } + + // Calculate the offset value that will be written + //inal byte[] digestOffsetBytes = Util.unsignedInt32ToByteArray(digestOffset);// //((digestOffset - DIGEST_OFFSET_INDICATOR_POS) % 728)); // Thanks to librtmp for the mod 728 + Log.d(TAG, "writeC1(): digestOffsetBytes: " + Util.toHexString( + digestOffsetBytes)); //Util.unsignedInt32ToByteArray((digestOffset % 728)))); + + // Create random bytes up to the digest offset point + byte[] partBeforeDigest = new byte[absoluteDigestOffset]; + Log.d(TAG, "partBeforeDigest(): size: " + partBeforeDigest.length); + random.nextBytes(partBeforeDigest); + + Log.d(TAG, "writeC1(): Writing timestamp and Flash Player version"); + byte[] timeStamp = Util.unsignedInt32ToByteArray((int) (System.currentTimeMillis() / 1000)); + System.arraycopy(timeStamp, 0, partBeforeDigest, 0, + 4); // Bytes 0 - 3 bytes: current epoch timestamp + System.arraycopy(new byte[] { (byte) 0x80, 0x00, 0x07, 0x02 }, 0, partBeforeDigest, 4, + 4); // Bytes 4 - 7: Flash player version: 11.2.202.233 + + // Create random bytes for the part after the digest + byte[] partAfterDigest = new byte[HANDSHAKE_SIZE + - absoluteDigestOffset + - SHA256_DIGEST_SIZE]; // subtract 8 because of initial 8 bytes already written + Log.d(TAG, "partAfterDigest(): size: " + partAfterDigest.length); + random.nextBytes(partAfterDigest); + + // Set the offset byte + Log.d(TAG, "copying digest offset bytes in partBeforeDigest"); + System.arraycopy(digestOffsetBytes, 0, partBeforeDigest, 772, 4); + Log.d(TAG, "writeC1(): Calculating digest"); + byte[] tempBuffer = new byte[HANDSHAKE_SIZE - SHA256_DIGEST_SIZE]; + System.arraycopy(partBeforeDigest, 0, tempBuffer, 0, partBeforeDigest.length); + System.arraycopy(partAfterDigest, 0, tempBuffer, partBeforeDigest.length, + partAfterDigest.length); + + Crypto crypto = new Crypto(); + byte[] digest = crypto.calculateHmacSHA256(tempBuffer, GENUINE_FP_KEY, 30); + + // Now write the packet + Log.d(TAG, "writeC1(): writing C1 packet"); + out.write(partBeforeDigest); + out.write(digest); + out.write(partAfterDigest); + } + + public final void readS1(InputStream in) throws IOException { + // S1 == 1536 bytes. We do not bother with checking the content of it + Log.d(TAG, "readS1"); + s1 = new byte[HANDSHAKE_SIZE]; + + // Read server time (4 bytes) + int totalBytesRead = 0; + int read; + do { + read = in.read(s1, totalBytesRead, (HANDSHAKE_SIZE - totalBytesRead)); + if (read != -1) { + totalBytesRead += read; + } + } while (totalBytesRead < HANDSHAKE_SIZE); + + if (totalBytesRead != HANDSHAKE_SIZE) { + throw new IOException("Unexpected EOF while reading S1, expected " + + HANDSHAKE_SIZE + + " bytes, but only read " + + totalBytesRead + + " bytes"); + } else { + Log.d(TAG, "readS1(): S1 total bytes read OK"); + } + } + + /** Generates and writes the third handshake packet (C2) */ + public final void writeC2(OutputStream out) throws IOException { + Log.d(TAG, "writeC2"); + // C2 is an echo of S1 + if (s1 == null) { + throw new IllegalStateException("C2 cannot be written without S1 being read first"); + } + out.write(s1); + } + + public final void readS2(InputStream in) throws IOException { + // S2 should be an echo of C1, but we are not too strict + Log.d(TAG, "readS2"); + byte[] sr_serverTime = new byte[4]; + byte[] s2_serverVersion = new byte[4]; + byte[] s2_rest = new byte[HANDSHAKE_SIZE - 8]; // subtract 4+4 bytes for time and version + + // Read server time (4 bytes) + int totalBytesRead = 0; + int read; + do { + read = in.read(sr_serverTime, totalBytesRead, (4 - totalBytesRead)); + if (read == -1) { + // End of stream reached - should not have happened at this point + throw new IOException("Unexpected EOF while reading S2 bytes 0-3"); + } else { + totalBytesRead += read; + } + } while (totalBytesRead < 4); + + // Read server version (4 bytes) + totalBytesRead = 0; + do { + read = in.read(s2_serverVersion, totalBytesRead, (4 - totalBytesRead)); + if (read == -1) { + // End of stream reached - should not have happened at this point + throw new IOException("Unexpected EOF while reading S2 bytes 4-7"); + } else { + totalBytesRead += read; + } + } while (totalBytesRead < 4); + + // Read 1528 bytes (to make up S1 total size of 1536 bytes) + final int remainingBytes = HANDSHAKE_SIZE - 8; + totalBytesRead = 0; + do { + read = in.read(s2_rest, totalBytesRead, (remainingBytes - totalBytesRead)); + if (read != -1) { + totalBytesRead += read; + } + } while (totalBytesRead < remainingBytes && read != -1); + + if (totalBytesRead != remainingBytes) { + throw new IOException("Unexpected EOF while reading remainder of S2, expected " + + remainingBytes + + " bytes, but only read " + + totalBytesRead + + " bytes"); + } else { + Log.d(TAG, "readS2(): S2 total bytes read OK"); + } + // Technically we should check that S2 == C1, but for now this is ignored + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/RtmpHeader.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/RtmpHeader.java new file mode 100644 index 0000000..8edea2a --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/RtmpHeader.java @@ -0,0 +1,413 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.github.faucamp.simplertmp.packets; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; + +import com.github.faucamp.simplertmp.Util; +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; +import com.github.faucamp.simplertmp.io.RtmpSessionInfo; + +/** + * @author francois, leoma + */ +public class RtmpHeader { + + private static final String TAG = "RtmpHeader"; + + /** + * RTMP packet/message type definitions. + * Note: docstrings are adapted from the official Adobe RTMP spec: + * http://www.adobe.com/devnet/rtmp/ + */ + public enum MessageType { + + /** + * Protocol control message 1 + * Set Chunk Size, is used to notify the peer a new maximum chunk size to use. + */ + SET_CHUNK_SIZE(0x01), /** + * Protocol control message 2 + * Abort Message, is used to notify the peer if it is waiting for chunks + * to complete a message, then to discard the partially received message + * over a chunk stream and abort processing of that message. + */ + ABORT(0x02), /** + * Protocol control message 3 + * The client or the server sends the acknowledgment to the peer after + * receiving bytes equal to the window size. The window size is the + * maximum number of bytes that the sender sends without receiving + * acknowledgment from the receiver. + */ + ACKNOWLEDGEMENT(0x03), /** + * Protocol control message 4 + * The client or the server sends this message to notify the peer about + * the user control events. This message carries Event type and Event + * data. + * Also known as a PING message in some RTMP implementations. + */ + USER_CONTROL_MESSAGE(0x04), /** + * Protocol control message 5 + * The client or the server sends this message to inform the peer which + * window size to use when sending acknowledgment. + * Also known as ServerBW ("server bandwidth") in some RTMP implementations. + */ + WINDOW_ACKNOWLEDGEMENT_SIZE(0x05), /** + * Protocol control message 6 + * The client or the server sends this message to update the output + * bandwidth of the peer. The output bandwidth value is the same as the + * window size for the peer. + * Also known as ClientBW ("client bandwidth") in some RTMP implementations. + */ + SET_PEER_BANDWIDTH(0x06), /** + * RTMP audio packet (0x08) + * The client or the server sends this message to send audio data to the peer. + */ + AUDIO(0x08), /** + * RTMP video packet (0x09) + * The client or the server sends this message to send video data to the peer. + */ + VIDEO(0x09), /** + * RTMP message type 0x0F + * The client or the server sends this message to send Metadata or any + * user data to the peer. Metadata includes details about the data (audio, video etc.) + * like creation time, duration, theme and so on. + * This is the AMF3-encoded version. + */ + DATA_AMF3(0x0F), /** + * RTMP message type 0x10 + * A shared object is a Flash object (a collection of name value pairs) + * that are in synchronization across multiple clients, instances, and + * so on. + * This is the AMF3 version: kMsgContainerEx=16 for AMF3. + */ + SHARED_OBJECT_AMF3(0x10), /** + * RTMP message type 0x11 + * Command messages carry the AMF-encoded commands between the client + * and the server. + * A command message consists of command name, transaction ID, and command object that + * contains related parameters. + * This is the AMF3-encoded version. + */ + COMMAND_AMF3(0x11), /** + * RTMP message type 0x12 + * The client or the server sends this message to send Metadata or any + * user data to the peer. Metadata includes details about the data (audio, video etc.) + * like creation time, duration, theme and so on. + * This is the AMF0-encoded version. + */ + DATA_AMF0(0x12), /** + * RTMP message type 0x14 + * Command messages carry the AMF-encoded commands between the client + * and the server. + * A command message consists of command name, transaction ID, and command object that + * contains related parameters. + * This is the common AMF0 version, also known as INVOKE in some RTMP implementations. + */ + COMMAND_AMF0(0x14), /** + * RTMP message type 0x13 + * A shared object is a Flash object (a collection of name value pairs) + * that are in synchronization across multiple clients, instances, and + * so on. + * This is the AMF0 version: kMsgContainer=19 for AMF0. + */ + SHARED_OBJECT_AMF0(0x13), /** + * RTMP message type 0x16 + * An aggregate message is a single message that contains a list of sub-messages. + */ + AGGREGATE_MESSAGE(0x16); + private byte value; + private static final Map quickLookupMap = new HashMap<>(); + + static { + for (MessageType messageTypId : MessageType.values()) { + quickLookupMap.put(messageTypId.getValue(), messageTypId); + } + } + + MessageType(int value) { + this.value = (byte) value; + } + + /** Returns the value of this chunk type */ + public byte getValue() { + return value; + } + + public static MessageType valueOf(byte messageTypeId) { + if (quickLookupMap.containsKey(messageTypeId)) { + return quickLookupMap.get(messageTypeId); + } else { + throw new IllegalArgumentException( + "Unknown message type byte: " + Util.toHexString(messageTypeId)); + } + } + } + + public enum ChunkType { + + /** Full 12-byte RTMP chunk header */ + TYPE_0_FULL(0x00), /** Relative 8-byte RTMP chunk header (message stream ID is not included) */ + TYPE_1_RELATIVE_LARGE(0x01), /** Relative 4-byte RTMP chunk header (only timestamp delta) */ + TYPE_2_RELATIVE_TIMESTAMP_ONLY(0x02), + /** Relative 1-byte RTMP chunk header (no "real" header, just the 1-byte indicating chunk header type & chunk stream ID) */ + TYPE_3_RELATIVE_SINGLE_BYTE(0x03); + /** The byte value of this chunk header type */ + private byte value; + /** The full size (in bytes) of this RTMP header (including the basic header byte) */ + private static final Map quickLookupMap = new HashMap<>(); + + static { + for (ChunkType messageTypId : ChunkType.values()) { + quickLookupMap.put(messageTypId.getValue(), messageTypId); + } + } + + ChunkType(int byteValue) { + this.value = (byte) byteValue; + } + + /** Returns the byte value of this chunk header type */ + public byte getValue() { + return value; + } + + public static ChunkType valueOf(byte chunkHeaderType) { + if (quickLookupMap.containsKey(chunkHeaderType)) { + return quickLookupMap.get(chunkHeaderType); + } else { + throw new IllegalArgumentException( + "Unknown chunk header type byte: " + Util.toHexString(chunkHeaderType)); + } + } + } + + private ChunkType chunkType; + private int chunkStreamId; + private int absoluteTimestamp; + private int timestampDelta = -1; + private int packetLength; + private MessageType messageType; + private int messageStreamId; + private int extendedTimestamp; + + public RtmpHeader() { + } + + public RtmpHeader(ChunkType chunkType, int chunkStreamId, MessageType messageType) { + this.chunkType = chunkType; + this.chunkStreamId = chunkStreamId; + this.messageType = messageType; + } + + public static RtmpHeader readHeader(InputStream in, RtmpSessionInfo rtmpSessionInfo) + throws IOException { + RtmpHeader rtmpHeader = new RtmpHeader(); + rtmpHeader.readHeaderImpl(in, rtmpSessionInfo); + return rtmpHeader; + } + + private void readHeaderImpl(InputStream in, RtmpSessionInfo rtmpSessionInfo) throws IOException { + + int basicHeaderByte = in.read(); + if (basicHeaderByte == -1) { + throw new EOFException("Unexpected EOF while reading RTMP packet basic header"); + } + // Read byte 0: chunk type and chunk stream ID + parseBasicHeader((byte) basicHeaderByte); + + switch (chunkType) { + case TYPE_0_FULL: { // b00 = 12 byte header (full header) + // Read bytes 1-3: Absolute timestamp + absoluteTimestamp = Util.readUnsignedInt24(in); + timestampDelta = 0; + // Read bytes 4-6: Packet length + packetLength = Util.readUnsignedInt24(in); + // Read byte 7: Message type ID + messageType = MessageType.valueOf((byte) in.read()); + // Read bytes 8-11: Message stream ID (apparently little-endian order) + byte[] messageStreamIdBytes = new byte[4]; + Util.readBytesUntilFull(in, messageStreamIdBytes); + messageStreamId = Util.toUnsignedInt32LittleEndian(messageStreamIdBytes); + // Read bytes 1-4: Extended timestamp + extendedTimestamp = absoluteTimestamp >= 0xffffff ? Util.readUnsignedInt32(in) : 0; + if (extendedTimestamp != 0) { + absoluteTimestamp = extendedTimestamp; + } + break; + } + case TYPE_1_RELATIVE_LARGE: { // b01 = 8 bytes - like type 0. not including message stream ID (4 last bytes) + // Read bytes 1-3: Timestamp delta + timestampDelta = Util.readUnsignedInt24(in); + // Read bytes 4-6: Packet length + packetLength = Util.readUnsignedInt24(in); + // Read byte 7: Message type ID + messageType = MessageType.valueOf((byte) in.read()); + // Read bytes 1-4: Extended timestamp delta + extendedTimestamp = timestampDelta >= 0xffffff ? Util.readUnsignedInt32(in) : 0; + RtmpHeader prevHeader = rtmpSessionInfo.getChunkStreamInfo(chunkStreamId).prevHeaderRx(); + if (prevHeader != null) { + messageStreamId = prevHeader.messageStreamId; + absoluteTimestamp = extendedTimestamp != 0 ? extendedTimestamp + : prevHeader.absoluteTimestamp + timestampDelta; + } else { + messageStreamId = 0; + absoluteTimestamp = extendedTimestamp != 0 ? extendedTimestamp : timestampDelta; + } + break; + } + case TYPE_2_RELATIVE_TIMESTAMP_ONLY: { // b10 = 4 bytes - Basic Header and timestamp (3 bytes) are included + // Read bytes 1-3: Timestamp delta + timestampDelta = Util.readUnsignedInt24(in); + // Read bytes 1-4: Extended timestamp delta + extendedTimestamp = timestampDelta >= 0xffffff ? Util.readUnsignedInt32(in) : 0; + RtmpHeader prevHeader = rtmpSessionInfo.getChunkStreamInfo(chunkStreamId).prevHeaderRx(); + packetLength = prevHeader.packetLength; + messageType = prevHeader.messageType; + messageStreamId = prevHeader.messageStreamId; + absoluteTimestamp = extendedTimestamp != 0 ? extendedTimestamp + : prevHeader.absoluteTimestamp + timestampDelta; + break; + } + case TYPE_3_RELATIVE_SINGLE_BYTE: { // b11 = 1 byte: basic header only + RtmpHeader prevHeader = rtmpSessionInfo.getChunkStreamInfo(chunkStreamId).prevHeaderRx(); + // Read bytes 1-4: Extended timestamp + extendedTimestamp = prevHeader.timestampDelta >= 0xffffff ? Util.readUnsignedInt32(in) : 0; + timestampDelta = extendedTimestamp != 0 ? 0xffffff : prevHeader.timestampDelta; + packetLength = prevHeader.packetLength; + messageType = prevHeader.messageType; + messageStreamId = prevHeader.messageStreamId; + absoluteTimestamp = extendedTimestamp != 0 ? extendedTimestamp + : prevHeader.absoluteTimestamp + timestampDelta; + break; + } + default: + throw new IOException("Invalid chunk type; basic header byte was: " + Util.toHexString( + (byte) basicHeaderByte)); + } + } + + public void writeTo(OutputStream out, ChunkType chunkType, final ChunkStreamInfo chunkStreamInfo) + throws IOException { + // Write basic header byte + out.write(((byte) (chunkType.getValue() << 6) | chunkStreamId)); + switch (chunkType) { + case TYPE_0_FULL: { // b00 = 12 byte header (full header) + chunkStreamInfo.markDeltaTimestampTx(); + Util.writeUnsignedInt24(out, + (absoluteTimestamp >= 0xffffff) ? 0xffffff : absoluteTimestamp); + Util.writeUnsignedInt24(out, packetLength); + out.write(messageType.getValue()); + Util.writeUnsignedInt32LittleEndian(out, messageStreamId); + if (absoluteTimestamp >= 0xffffff) { + extendedTimestamp = absoluteTimestamp; + Util.writeUnsignedInt32(out, extendedTimestamp); + } + break; + } + case TYPE_1_RELATIVE_LARGE: { // b01 = 8 bytes - like type 0. not including message ID (4 last bytes) + timestampDelta = (int) chunkStreamInfo.markDeltaTimestampTx(); + absoluteTimestamp = + chunkStreamInfo.getPrevHeaderTx().getAbsoluteTimestamp() + timestampDelta; + Util.writeUnsignedInt24(out, (absoluteTimestamp >= 0xffffff) ? 0xffffff : timestampDelta); + Util.writeUnsignedInt24(out, packetLength); + out.write(messageType.getValue()); + if (absoluteTimestamp >= 0xffffff) { + extendedTimestamp = absoluteTimestamp; + Util.writeUnsignedInt32(out, absoluteTimestamp); + } + break; + } + case TYPE_2_RELATIVE_TIMESTAMP_ONLY: { // b10 = 4 bytes - Basic Header and timestamp (3 bytes) are included + timestampDelta = (int) chunkStreamInfo.markDeltaTimestampTx(); + absoluteTimestamp = + chunkStreamInfo.getPrevHeaderTx().getAbsoluteTimestamp() + timestampDelta; + Util.writeUnsignedInt24(out, (absoluteTimestamp >= 0xffffff) ? 0xffffff : timestampDelta); + if (absoluteTimestamp >= 0xffffff) { + extendedTimestamp = absoluteTimestamp; + Util.writeUnsignedInt32(out, extendedTimestamp); + } + break; + } + case TYPE_3_RELATIVE_SINGLE_BYTE: { // b11 = 1 byte: basic header only + if (extendedTimestamp > 0) { + Util.writeUnsignedInt32(out, extendedTimestamp); + } + break; + } + default: + throw new IOException("Invalid chunk type: " + chunkType); + } + } + + private void parseBasicHeader(byte basicHeaderByte) { + chunkType = ChunkType.valueOf( + (byte) ((0xff & basicHeaderByte) >>> 6)); // 2 most significant bits define the chunk type + chunkStreamId = basicHeaderByte & 0x3F; // 6 least significant bits define chunk stream ID + } + + /** @return the RTMP chunk stream ID (channel ID) for this chunk */ + public int getChunkStreamId() { + return chunkStreamId; + } + + public ChunkType getChunkType() { + return chunkType; + } + + public int getPacketLength() { + return packetLength; + } + + public int getMessageStreamId() { + return messageStreamId; + } + + public MessageType getMessageType() { + return messageType; + } + + public int getAbsoluteTimestamp() { + return absoluteTimestamp; + } + + public void setAbsoluteTimestamp(int absoluteTimestamp) { + this.absoluteTimestamp = absoluteTimestamp; + } + + public int getTimestampDelta() { + return timestampDelta; + } + + public void setTimestampDelta(int timestampDelta) { + this.timestampDelta = timestampDelta; + } + + /** Sets the RTMP chunk stream ID (channel ID) for this chunk */ + public void setChunkStreamId(int channelId) { + this.chunkStreamId = channelId; + } + + public void setChunkType(ChunkType chunkType) { + this.chunkType = chunkType; + } + + public void setMessageStreamId(int messageStreamId) { + this.messageStreamId = messageStreamId; + } + + public void setMessageType(MessageType messageType) { + this.messageType = messageType; + } + + public void setPacketLength(int packetLength) { + this.packetLength = packetLength; + } +} \ No newline at end of file diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/RtmpPacket.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/RtmpPacket.java new file mode 100644 index 0000000..c52d7ee --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/RtmpPacket.java @@ -0,0 +1,53 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; + +/** + * @author francois, leo + */ +public abstract class RtmpPacket { + + protected RtmpHeader header; + + public RtmpPacket(RtmpHeader header) { + this.header = header; + } + + public RtmpHeader getHeader() { + return header; + } + + public abstract void readBody(InputStream in) throws IOException; + + protected abstract void writeBody(OutputStream out) throws IOException; + + protected abstract byte[] array(); + + protected abstract int size(); + + public void writeTo(OutputStream out, final int chunkSize, final ChunkStreamInfo chunkStreamInfo) + throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + writeBody(baos); + byte[] body = this instanceof ContentData ? array() : baos.toByteArray(); + int length = this instanceof ContentData ? size() : body.length; + header.setPacketLength(length); + // Write header for first chunk + header.writeTo(out, RtmpHeader.ChunkType.TYPE_0_FULL, chunkStreamInfo); + int pos = 0; + while (length > chunkSize) { + // Write packet for chunk + out.write(body, pos, chunkSize); + length -= chunkSize; + pos += chunkSize; + // Write header for remain chunk + header.writeTo(out, RtmpHeader.ChunkType.TYPE_3_RELATIVE_SINGLE_BYTE, chunkStreamInfo); + } + out.write(body, pos, length); + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/SetChunkSize.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/SetChunkSize.java new file mode 100644 index 0000000..2554f4e --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/SetChunkSize.java @@ -0,0 +1,57 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.github.faucamp.simplertmp.Util; +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; + +/** + * A "Set chunk size" RTMP message, received on chunk stream ID 2 (control channel) + * + * @author francois + */ +public class SetChunkSize extends RtmpPacket { + + private int chunkSize; + + public SetChunkSize(RtmpHeader header) { + super(header); + } + + public SetChunkSize(int chunkSize) { + super(new RtmpHeader(RtmpHeader.ChunkType.TYPE_1_RELATIVE_LARGE, + ChunkStreamInfo.RTMP_CID_PROTOCOL_CONTROL, RtmpHeader.MessageType.SET_CHUNK_SIZE)); + this.chunkSize = chunkSize; + } + + public int getChunkSize() { + return chunkSize; + } + + public void setChunkSize(int chunkSize) { + this.chunkSize = chunkSize; + } + + @Override + public void readBody(InputStream in) throws IOException { + // Value is received in the 4 bytes of the body + chunkSize = Util.readUnsignedInt32(in); + } + + @Override + protected void writeBody(OutputStream out) throws IOException { + Util.writeUnsignedInt32(out, chunkSize); + } + + @Override + protected byte[] array() { + return null; + } + + @Override + protected int size() { + return 0; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/SetPeerBandwidth.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/SetPeerBandwidth.java new file mode 100644 index 0000000..c4d940f --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/SetPeerBandwidth.java @@ -0,0 +1,118 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; + +import com.github.faucamp.simplertmp.Util; +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; + +/** + * Set Peer Bandwidth + * + * Also known as ClientrBW ("client bandwidth") in some RTMP implementations. + * + * @author francois + */ +public class SetPeerBandwidth extends RtmpPacket { + + /** + * Bandwidth limiting type + */ + public static enum LimitType { + + /** + * In a hard (0) request, the peer must send the data in the provided bandwidth. + */ + HARD(0), /** + * In a soft (1) request, the bandwidth is at the discretion of the peer + * and the sender can limit the bandwidth. + */ + SOFT(1), /** + * In a dynamic (2) request, the bandwidth can be hard or soft. + */ + DYNAMIC(2); + private int intValue; + private static final Map quickLookupMap = new HashMap<>(); + + static { + for (LimitType type : LimitType.values()) { + quickLookupMap.put(type.getIntValue(), type); + } + } + + private LimitType(int intValue) { + this.intValue = intValue; + } + + public int getIntValue() { + return intValue; + } + + public static LimitType valueOf(int intValue) { + return quickLookupMap.get(intValue); + } + } + + private int acknowledgementWindowSize; + private LimitType limitType; + + public SetPeerBandwidth(RtmpHeader header) { + super(header); + } + + public SetPeerBandwidth(int acknowledgementWindowSize, LimitType limitType, + ChunkStreamInfo channelInfo) { + super(new RtmpHeader(channelInfo.canReusePrevHeaderTx(RtmpHeader.MessageType.SET_PEER_BANDWIDTH) + ? RtmpHeader.ChunkType.TYPE_2_RELATIVE_TIMESTAMP_ONLY : RtmpHeader.ChunkType.TYPE_0_FULL, + ChunkStreamInfo.RTMP_CID_PROTOCOL_CONTROL, + RtmpHeader.MessageType.WINDOW_ACKNOWLEDGEMENT_SIZE)); + this.acknowledgementWindowSize = acknowledgementWindowSize; + this.limitType = limitType; + } + + public int getAcknowledgementWindowSize() { + return acknowledgementWindowSize; + } + + public void setAcknowledgementWindowSize(int acknowledgementWindowSize) { + this.acknowledgementWindowSize = acknowledgementWindowSize; + } + + public LimitType getLimitType() { + return limitType; + } + + public void setLimitType(LimitType limitType) { + this.limitType = limitType; + } + + @Override + public void readBody(InputStream in) throws IOException { + acknowledgementWindowSize = Util.readUnsignedInt32(in); + limitType = LimitType.valueOf(in.read()); + } + + @Override + protected void writeBody(OutputStream out) throws IOException { + Util.writeUnsignedInt32(out, acknowledgementWindowSize); + out.write(limitType.getIntValue()); + } + + @Override + protected byte[] array() { + return null; + } + + @Override + protected int size() { + return 0; + } + + @Override + public String toString() { + return "RTMP Set Peer Bandwidth"; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/UserControl.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/UserControl.java new file mode 100644 index 0000000..ed7a1b9 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/UserControl.java @@ -0,0 +1,252 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; + +import com.github.faucamp.simplertmp.Util; +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; + +/** + * User Control message, such as ping + * + * @author francois + */ +public class UserControl extends RtmpPacket { + + /** + * Control message type + * Docstring adapted from the official Adobe RTMP spec, section 3.7 + */ + public static enum Type { + + /** + * Type: 0 + * The server sends this event to notify the client that a stream has become + * functional and can be used for communication. By default, this event + * is sent on ID 0 after the application connect command is successfully + * received from the client. + * + * Event Data: + * eventData[0] (int) the stream ID of the stream that became functional + */ + STREAM_BEGIN(0), /** + * Type: 1 + * The server sends this event to notify the client that the playback of + * data is over as requested on this stream. No more data is sent without + * issuing additional commands. The client discards the messages received + * for the stream. + * + * Event Data: + * eventData[0]: the ID of thestream on which playback has ended. + */ + STREAM_EOF(1), /** + * Type: 2 + * The server sends this event to notify the client that there is no + * more data on the stream. If the server does not detect any message for + * a time period, it can notify the subscribed clients that the stream is + * dry. + * + * Event Data: + * eventData[0]: the stream ID of the dry stream. + */ + STREAM_DRY(2), /** + * Type: 3 + * The client sends this event to inform the server of the buffer size + * (in milliseconds) that is used to buffer any data coming over a stream. + * This event is sent before the server starts processing the stream. + * + * Event Data: + * eventData[0]: the stream ID and + * eventData[1]: the buffer length, in milliseconds. + */ + SET_BUFFER_LENGTH(3), /** + * Type: 4 + * The server sends this event to notify the client that the stream is a + * recorded stream. + * + * Event Data: + * eventData[0]: the stream ID of the recorded stream. + */ + STREAM_IS_RECORDED(4), /** + * Type: 6 + * The server sends this event to test whether the client is reachable. + * + * Event Data: + * eventData[0]: a timestamp representing the local server time when the server dispatched the command. + * + * The client responds with PING_RESPONSE on receiving PING_REQUEST. + */ + PING_REQUEST(6), /** + * Type: 7 + * The client sends this event to the server in response to the ping request. + * + * Event Data: + * eventData[0]: the 4-byte timestamp which was received with the PING_REQUEST. + */ + PONG_REPLY(7), /** + * Type: 31 (0x1F) + * + * This user control type is not specified in any official documentation, but + * is sent by Flash Media Server 3.5. Thanks to the rtmpdump devs for their + * explanation: + * + * Buffer Empty (unofficial name): After the server has sent a complete buffer, and + * sends this Buffer Empty message, it will wait until the play + * duration of that buffer has passed before sending a new buffer. + * The Buffer Ready message will be sent when the new buffer starts. + * + * (see also: http://repo.or.cz/w/rtmpdump.git/blob/8880d1456b282ee79979adbe7b6a6eb8ad371081:/librtmp/rtmp.c#l2787) + */ + BUFFER_EMPTY(31), /** + * Type: 32 (0x20) + * + * This user control type is not specified in any official documentation, but + * is sent by Flash Media Server 3.5. Thanks to the rtmpdump devs for their + * explanation: + * + * Buffer Ready (unofficial name): After the server has sent a complete buffer, and + * sends a Buffer Empty message, it will wait until the play + * duration of that buffer has passed before sending a new buffer. + * The Buffer Ready message will be sent when the new buffer starts. + * (There is no BufferReady message for the very first buffer; + * presumably the Stream Begin message is sufficient for that + * purpose.) + * + * (see also: http://repo.or.cz/w/rtmpdump.git/blob/8880d1456b282ee79979adbe7b6a6eb8ad371081:/librtmp/rtmp.c#l2787) + */ + BUFFER_READY(32); + + private int intValue; + private static final Map quickLookupMap = new HashMap(); + + static { + for (Type type : Type.values()) { + quickLookupMap.put(type.getIntValue(), type); + } + } + + private Type(int intValue) { + this.intValue = intValue; + } + + public int getIntValue() { + return intValue; + } + + public static Type valueOf(int intValue) { + return quickLookupMap.get(intValue); + } + } + + private Type type; + private int[] eventData; + + public UserControl(RtmpHeader header) { + super(header); + } + + public UserControl(ChunkStreamInfo channelInfo) { + super(new RtmpHeader( + channelInfo.canReusePrevHeaderTx(RtmpHeader.MessageType.USER_CONTROL_MESSAGE) + ? RtmpHeader.ChunkType.TYPE_2_RELATIVE_TIMESTAMP_ONLY + : RtmpHeader.ChunkType.TYPE_0_FULL, ChunkStreamInfo.RTMP_CID_PROTOCOL_CONTROL, + RtmpHeader.MessageType.USER_CONTROL_MESSAGE)); + } + + /** Convenience construtor that creates a "pong" message for the specified ping */ + public UserControl(UserControl replyToPing, ChunkStreamInfo channelInfo) { + this(Type.PONG_REPLY, channelInfo); + this.eventData = replyToPing.eventData; + } + + public UserControl(Type type, ChunkStreamInfo channelInfo) { + this(channelInfo); + this.type = type; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + /** + * Convenience method for getting the first event data item, as most user control + * message types only have one event data item anyway + * This is equivalent to calling getEventData()[0] + */ + public int getFirstEventData() { + return eventData[0]; + } + + public int[] getEventData() { + return eventData; + } + + /** Used to set (a single) event data for most user control message types */ + public void setEventData(int eventData) { + if (type == Type.SET_BUFFER_LENGTH) { + throw new IllegalStateException( + "SET_BUFFER_LENGTH requires two event data values; use setEventData(int, int) instead"); + } + this.eventData = new int[] { eventData }; + } + + /** Used to set event data for the SET_BUFFER_LENGTH user control message types */ + public void setEventData(int streamId, int bufferLength) { + if (type != Type.SET_BUFFER_LENGTH) { + throw new IllegalStateException("User control type " + + type + + " requires only one event data value; use setEventData(int) instead"); + } + this.eventData = new int[] { streamId, bufferLength }; + } + + @Override + public void readBody(InputStream in) throws IOException { + // Bytes 0-1: first parameter: ping type (mandatory) + type = Type.valueOf(Util.readUnsignedInt16(in)); + int bytesRead = 2; + // Event data (1 for most types, 2 for SET_BUFFER_LENGTH) + if (type == Type.SET_BUFFER_LENGTH) { + setEventData(Util.readUnsignedInt32(in), Util.readUnsignedInt32(in)); + bytesRead += 8; + } else { + setEventData(Util.readUnsignedInt32(in)); + bytesRead += 4; + } + // To ensure some strange non-specified UserControl/ping message does not slip through + assert header.getPacketLength() == bytesRead; + } + + @Override + protected void writeBody(OutputStream out) throws IOException { + // Write the user control message type + Util.writeUnsignedInt16(out, type.getIntValue()); + // Now write the event data + Util.writeUnsignedInt32(out, eventData[0]); + if (type == Type.SET_BUFFER_LENGTH) { + Util.writeUnsignedInt32(out, eventData[1]); + } + } + + @Override + protected byte[] array() { + return null; + } + + @Override + protected int size() { + return 0; + } + + @Override + public String toString() { + return "RTMP User Control (type: " + type + ", event data: " + eventData + ")"; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/VariableBodyRtmpPacket.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/VariableBodyRtmpPacket.java new file mode 100644 index 0000000..d4126fa --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/VariableBodyRtmpPacket.java @@ -0,0 +1,78 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + +import com.github.faucamp.simplertmp.amf.AmfBoolean; +import com.github.faucamp.simplertmp.amf.AmfData; +import com.github.faucamp.simplertmp.amf.AmfDecoder; +import com.github.faucamp.simplertmp.amf.AmfNull; +import com.github.faucamp.simplertmp.amf.AmfNumber; +import com.github.faucamp.simplertmp.amf.AmfString; + +/** + * RTMP packet with a "variable" body structure (i.e. the structure of the + * body depends on some other state/parameter in the packet. + * + * Examples of this type of packet are Command and Data; this abstract class + * exists mostly for code re-use. + * + * @author francois + */ +public abstract class VariableBodyRtmpPacket extends RtmpPacket { + + protected List data; + + public VariableBodyRtmpPacket(RtmpHeader header) { + super(header); + } + + public List getData() { + return data; + } + + public void addData(String string) { + addData(new AmfString(string)); + } + + public void addData(double number) { + addData(new AmfNumber(number)); + } + + public void addData(boolean bool) { + addData(new AmfBoolean(bool)); + } + + public void addData(AmfData dataItem) { + if (data == null) { + data = new ArrayList<>(); + } + if (dataItem == null) { + dataItem = new AmfNull(); + } + data.add(dataItem); + } + + protected void readVariableData(final InputStream in, int bytesAlreadyRead) throws IOException { + // ...now read in arguments (if any) + do { + AmfData dataItem = AmfDecoder.readFrom(in); + addData(dataItem); + bytesAlreadyRead += dataItem.getSize(); + } while (bytesAlreadyRead < header.getPacketLength()); + } + + protected void writeVariableData(final OutputStream out) throws IOException { + if (data != null) { + for (AmfData dataItem : data) { + dataItem.writeTo(out); + } + } else { + // Write a null + AmfNull.writeNullTo(out); + } + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Video.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Video.java new file mode 100644 index 0000000..1441d66 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/Video.java @@ -0,0 +1,25 @@ +package com.github.faucamp.simplertmp.packets; + +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; + +/** + * Video data packet + * + * @author francois + */ +public class Video extends ContentData { + + public Video(RtmpHeader header) { + super(header); + } + + public Video() { + super(new RtmpHeader(RtmpHeader.ChunkType.TYPE_0_FULL, ChunkStreamInfo.RTMP_CID_VIDEO, + RtmpHeader.MessageType.VIDEO)); + } + + @Override + public String toString() { + return "RTMP Video"; + } +} diff --git a/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/WindowAckSize.java b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/WindowAckSize.java new file mode 100644 index 0000000..6194686 --- /dev/null +++ b/rtmp/src/main/java/com/github/faucamp/simplertmp/packets/WindowAckSize.java @@ -0,0 +1,66 @@ +package com.github.faucamp.simplertmp.packets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.github.faucamp.simplertmp.Util; +import com.github.faucamp.simplertmp.io.ChunkStreamInfo; + +/** + * Window Acknowledgement Size + * + * Also known as ServerBW ("Server bandwidth") in some RTMP implementations. + * + * @author francois + */ +public class WindowAckSize extends RtmpPacket { + + private int acknowledgementWindowSize; + + public WindowAckSize(RtmpHeader header) { + super(header); + } + + public WindowAckSize(int acknowledgementWindowSize, ChunkStreamInfo channelInfo) { + super(new RtmpHeader( + channelInfo.canReusePrevHeaderTx(RtmpHeader.MessageType.WINDOW_ACKNOWLEDGEMENT_SIZE) + ? RtmpHeader.ChunkType.TYPE_2_RELATIVE_TIMESTAMP_ONLY + : RtmpHeader.ChunkType.TYPE_0_FULL, ChunkStreamInfo.RTMP_CID_PROTOCOL_CONTROL, + RtmpHeader.MessageType.WINDOW_ACKNOWLEDGEMENT_SIZE)); + this.acknowledgementWindowSize = acknowledgementWindowSize; + } + + public int getAcknowledgementWindowSize() { + return acknowledgementWindowSize; + } + + public void setAcknowledgementWindowSize(int acknowledgementWindowSize) { + this.acknowledgementWindowSize = acknowledgementWindowSize; + } + + @Override + public void readBody(InputStream in) throws IOException { + acknowledgementWindowSize = Util.readUnsignedInt32(in); + } + + @Override + protected void writeBody(OutputStream out) throws IOException { + Util.writeUnsignedInt32(out, acknowledgementWindowSize); + } + + @Override + protected byte[] array() { + return null; + } + + @Override + protected int size() { + return 0; + } + + @Override + public String toString() { + return "RTMP Window Acknowledgment Size"; + } +} diff --git a/rtmp/src/main/java/net/ossrs/rtmp/BitrateManager.java b/rtmp/src/main/java/net/ossrs/rtmp/BitrateManager.java new file mode 100644 index 0000000..db38ce8 --- /dev/null +++ b/rtmp/src/main/java/net/ossrs/rtmp/BitrateManager.java @@ -0,0 +1,27 @@ +package net.ossrs.rtmp; + +/** + * Created by pedro on 10/07/19. + * + * Calculate video and audio bitrate per second + */ +public class BitrateManager { + + private long bitrate; + private long timeStamp = System.currentTimeMillis(); + private ConnectCheckerRtmp connectCheckerRtmp; + + public BitrateManager(ConnectCheckerRtmp connectCheckerRtsp) { + this.connectCheckerRtmp = connectCheckerRtsp; + } + + public synchronized void calculateBitrate(long size) { + bitrate += size; + long timeDiff = System.currentTimeMillis() - timeStamp; + if (timeDiff >= 1000) { + connectCheckerRtmp.onNewBitrateRtmp((int) (bitrate / (timeDiff / 1000f))); + timeStamp = System.currentTimeMillis(); + bitrate = 0; + } + } +} diff --git a/rtmp/src/main/java/net/ossrs/rtmp/ConnectCheckerRtmp.java b/rtmp/src/main/java/net/ossrs/rtmp/ConnectCheckerRtmp.java new file mode 100644 index 0000000..6e60cf0 --- /dev/null +++ b/rtmp/src/main/java/net/ossrs/rtmp/ConnectCheckerRtmp.java @@ -0,0 +1,22 @@ +package net.ossrs.rtmp; + +import androidx.annotation.NonNull; + +/** + * Created by pedro on 25/01/17. + */ + +public interface ConnectCheckerRtmp { + + void onConnectionSuccessRtmp(); + + void onConnectionFailedRtmp(@NonNull String reason); + + void onNewBitrateRtmp(long bitrate); + + void onDisconnectRtmp(); + + void onAuthErrorRtmp(); + + void onAuthSuccessRtmp(); +} diff --git a/rtmp/src/main/java/net/ossrs/rtmp/CreateSSLSocket.java b/rtmp/src/main/java/net/ossrs/rtmp/CreateSSLSocket.java new file mode 100644 index 0000000..6c238ad --- /dev/null +++ b/rtmp/src/main/java/net/ossrs/rtmp/CreateSSLSocket.java @@ -0,0 +1,31 @@ +package net.ossrs.rtmp; + +import android.util.Log; +import java.io.IOException; +import java.net.Socket; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; + +/** + * Created by pedro on 25/02/17. + * + * this class is used for secure transport, to use replace socket on RtmpConnection with this and + * you will have a secure stream under ssl/tls. + */ + +public class CreateSSLSocket { + + /** + * @param host variable from RtmpConnection + * @param port variable from RtmpConnection + */ + public static Socket createSSlSocket(String host, int port) { + try { + TLSSocketFactory socketFactory = new TLSSocketFactory(); + return socketFactory.createSocket(host, port); + } catch (NoSuchAlgorithmException | KeyManagementException | IOException e) { + Log.e("CreateSSLSocket", "Error", e); + return null; + } + } +} diff --git a/rtmp/src/main/java/net/ossrs/rtmp/ProfileIop.java b/rtmp/src/main/java/net/ossrs/rtmp/ProfileIop.java new file mode 100644 index 0000000..87d3c8f --- /dev/null +++ b/rtmp/src/main/java/net/ossrs/rtmp/ProfileIop.java @@ -0,0 +1,11 @@ +package net.ossrs.rtmp; + +/** + * Created by pedro on 18/12/17. + */ + +public class ProfileIop { + + public static final byte BASELINE = 0x00; + public static final byte CONSTRAINED = (byte) 0xC0; +} diff --git a/rtmp/src/main/java/net/ossrs/rtmp/SrsAllocator.java b/rtmp/src/main/java/net/ossrs/rtmp/SrsAllocator.java new file mode 100644 index 0000000..b625f94 --- /dev/null +++ b/rtmp/src/main/java/net/ossrs/rtmp/SrsAllocator.java @@ -0,0 +1,116 @@ +package net.ossrs.rtmp; + +import java.util.Arrays; + +public final class SrsAllocator { + + public class Allocation { + + private byte[] data; + private int size; + + public Allocation(int size) { + this.data = new byte[size]; + this.size = 0; + } + + public byte[] array() { + return data; + } + + public int size() { + return size; + } + + public void appendOffset(int offset) { + size += offset; + } + + public void clear() { + size = 0; + } + + public void put(byte b) { + data[size++] = b; + } + + public void put(byte b, int pos) { + data[pos++] = b; + size = pos > size ? pos : size; + } + + public void put(short s) { + put((byte) s); + put((byte) (s >>> 8)); + } + + public void put(int i) { + put((byte) i); + put((byte) (i >>> 8)); + put((byte) (i >>> 16)); + put((byte) (i >>> 24)); + } + + public void put(byte[] bs) { + System.arraycopy(bs, 0, data, size, bs.length); + size += bs.length; + } + } + + private final int individualAllocationSize; + private volatile int availableSentinel; + private Allocation[] availableAllocations; + + /** + * Constructs an instance without creating any {@link Allocation}s up front. + * + * @param individualAllocationSize The length of each individual {@link Allocation}. + */ + public SrsAllocator(int individualAllocationSize) { + this(individualAllocationSize, 0); + } + + /** + * Constructs an instance with some {@link Allocation}s created up front. + *

+ * + * @param individualAllocationSize The length of each individual {@link Allocation}. + * @param initialAllocationCount The number of allocations to create up front. + */ + public SrsAllocator(int individualAllocationSize, int initialAllocationCount) { + this.individualAllocationSize = individualAllocationSize; + this.availableSentinel = initialAllocationCount + 10; + this.availableAllocations = new Allocation[availableSentinel]; + for (int i = 0; i < availableSentinel; i++) { + availableAllocations[i] = new Allocation(individualAllocationSize); + } + } + + public synchronized Allocation allocate(int size) { + for (int i = 0; i < availableSentinel; i++) { + if (availableAllocations[i].size() >= size) { + Allocation ret = availableAllocations[i]; + availableAllocations[i] = null; + return ret; + } + } + + return new Allocation(size > individualAllocationSize ? size : individualAllocationSize); + } + + public synchronized void release(Allocation allocation) { + allocation.clear(); + + for (int i = 0; i < availableSentinel; i++) { + if (availableAllocations[i].size() == 0) { + availableAllocations[i] = allocation; + return; + } + } + + if (availableSentinel + 1 > availableAllocations.length) { + availableAllocations = Arrays.copyOf(availableAllocations, availableAllocations.length * 2); + } + availableAllocations[availableSentinel++] = allocation; + } +} \ No newline at end of file diff --git a/rtmp/src/main/java/net/ossrs/rtmp/SrsFlvMuxer.java b/rtmp/src/main/java/net/ossrs/rtmp/SrsFlvMuxer.java new file mode 100644 index 0000000..e0d7cf6 --- /dev/null +++ b/rtmp/src/main/java/net/ossrs/rtmp/SrsFlvMuxer.java @@ -0,0 +1,1048 @@ +package net.ossrs.rtmp; + +import android.media.MediaCodec; +import android.os.Handler; +import android.os.Looper; +import android.os.Process; +import android.util.Log; +import com.github.faucamp.simplertmp.DefaultRtmpPublisher; +import com.github.faucamp.simplertmp.RtmpPublisher; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +/** + * Created by winlin on 5/2/15. + * Updated by leoma on 4/1/16. + * modified by pedro + * to POST the h.264/avc annexb frame over RTMP. + * modified by Troy + * to accept any RtmpPublisher implementation. + * + * Usage: + * muxer = new SrsRtmp("rtmp://ossrs.net/live/yasea"); + * muxer.start(); + * + * MediaFormat aformat = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, sampleRate, + * achannel); + * // setup the aformat for audio. + * atrack = muxer.addTrack(aformat); + * + * MediaFormat vformat = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, vsize.width, + * vsize.height); + * // setup the vformat for video. + * vtrack = muxer.addTrack(vformat); + * + * // encode the video frame from camera by h.264 codec to es and bi, + * // where es is the h.264 ES(element stream). + * ByteBuffer es, MediaCodec.BufferInfo bi; + * muxer.writeSampleData(vtrack, es, bi); + * + * // encode the audio frame from microphone by aac codec to es and bi, + * // where es is the aac ES(element stream). + * ByteBuffer es, MediaCodec.BufferInfo bi; + * muxer.writeSampleData(atrack, es, bi); + * + * muxer.stop(); + * muxer.release(); + */ + +public class SrsFlvMuxer { + + private static final String TAG = "SrsFlvMuxer"; + + private static final int VIDEO_ALLOC_SIZE = 128 * 1024; + private static final int AUDIO_ALLOC_SIZE = 4 * 1024; + private volatile boolean connected = false; + private RtmpPublisher publisher; + private Thread worker; + private SrsFlv flv = new SrsFlv(); + private boolean needToFindKeyFrame = true; + private SrsFlvFrame mVideoSequenceHeader; + private SrsFlvFrame mAudioSequenceHeader; + private SrsAllocator mVideoAllocator = new SrsAllocator(VIDEO_ALLOC_SIZE); + private SrsAllocator mAudioAllocator = new SrsAllocator(AUDIO_ALLOC_SIZE); + private volatile BlockingQueue mFlvVideoTagCache = new LinkedBlockingQueue<>(30); + private volatile BlockingQueue mFlvAudioTagCache = new LinkedBlockingQueue<>(30); + private ConnectCheckerRtmp connectCheckerRtmp; + private int sampleRate = 0; + private boolean isPpsSpsSend = false; + private byte profileIop = ProfileIop.BASELINE; + private String url; + //re connection + private int numRetry; + private int reTries; + private Handler handler; + private Runnable runnable; + + private long mAudioFramesSent = 0; + private long mVideoFramesSent = 0; + private long mDroppedAudioFrames = 0; + private long mDroppedVideoFrames = 0; + + /** + * constructor. + */ + public SrsFlvMuxer(ConnectCheckerRtmp connectCheckerRtmp, RtmpPublisher publisher) { + this.connectCheckerRtmp = connectCheckerRtmp; + this.publisher = publisher; + handler = new Handler(Looper.getMainLooper()); + } + + public SrsFlvMuxer(ConnectCheckerRtmp connectCheckerRtmp) { + this(connectCheckerRtmp, new DefaultRtmpPublisher(connectCheckerRtmp)); + } + + public void setProfileIop(byte profileIop) { + this.profileIop = profileIop; + } + + public void setSpsPPs(ByteBuffer sps, ByteBuffer pps) { + flv.setSpsPPs(sps, pps); + } + + public void setSampleRate(int sampleRate) { + this.sampleRate = sampleRate; + } + + public void setIsStereo(boolean isStereo) { + int channel = (isStereo) ? 2 : 1; + flv.setAchannel(channel); + } + + public void setAuthorization(String user, String password) { + publisher.setAuthorization(user, password); + } + + public boolean isConnected() { + return connected; + } + + public void resizeFlvTagCache(int newSize) { + synchronized (mFlvAudioTagCache) { + mFlvAudioTagCache = resizeFlvTagCacheInternal(mFlvAudioTagCache, newSize); + } + synchronized (mFlvVideoTagCache) { + mFlvVideoTagCache = resizeFlvTagCacheInternal(mFlvVideoTagCache, newSize); + } + } + + private BlockingQueue resizeFlvTagCacheInternal(BlockingQueue cache, int newSize) { + if(newSize < cache.size() - cache.remainingCapacity()) { + throw new RuntimeException("Can't fit current cache inside new cache size"); + } + + BlockingQueue newQueue = new LinkedBlockingQueue<>(newSize); + cache.drainTo(newQueue); + return newQueue; + } + + public int getFlvTagCacheSize() { + return mFlvVideoTagCache.size() + mFlvAudioTagCache.size(); + } + + public long getSentAudioFrames() { + return mAudioFramesSent; + } + + public long getSentVideoFrames() { + return mVideoFramesSent; + } + + public long getDroppedAudioFrames() { + return mDroppedAudioFrames; + } + + public long getDroppedVideoFrames() { + return mDroppedVideoFrames; + } + + public void resetSentAudioFrames() { + mAudioFramesSent = 0; + } + + public void resetSentVideoFrames() { + mVideoFramesSent = 0; + } + + public void resetDroppedAudioFrames() { + mDroppedAudioFrames = 0; + } + + public void resetDroppedVideoFrames() { + mDroppedVideoFrames = 0; + } + + /** + * set video resolution for publisher + * + * @param width width + * @param height height + */ + public void setVideoResolution(int width, int height) { + publisher.setVideoResolution(width, height); + } + + private void disconnect(ConnectCheckerRtmp connectChecker) { + try { + publisher.close(); + } catch (IllegalStateException e) { + // Ignore illegal state. + } + connected = false; + mVideoSequenceHeader = null; + mAudioSequenceHeader = null; + + resetSentAudioFrames(); + resetSentVideoFrames(); + resetDroppedAudioFrames(); + resetDroppedVideoFrames(); + + if (connectChecker != null) { + reTries = 0; + connectChecker.onDisconnectRtmp(); + } + Log.i(TAG, "worker: disconnect ok."); + } + + public void setReTries(int reTries) { + numRetry = reTries; + this.reTries = reTries; + } + + public boolean shouldRetry(String reason) { + boolean validReason = !reason.contains("Endpoint malformed"); + return validReason && reTries > 0; + } + + public void reConnect(final long delay) { + reTries--; + stop(null); + runnable = new Runnable() { + @Override + public void run() { + start(url); + } + }; + handler.postDelayed(runnable, delay); + } + + private boolean connect(String url) { + this.url = url; + if (!connected) { + Log.i(TAG, String.format("worker: connecting to RTMP server by url=%s\n", url)); + if (publisher.connect(url)) { + connected = publisher.publish("live"); + } + mVideoSequenceHeader = null; + mAudioSequenceHeader = null; + } + return connected; + } + + private void sendFlvTag(SrsFlvFrame frame) { + if (!connected || frame == null) { + return; + } + + if (frame.is_video()) { + if (frame.is_keyframe()) { + Log.i(TAG, + String.format("worker: send frame type=%d, dts=%d, size=%dB", frame.type, frame.dts, + frame.flvTag.array().length)); + } + publisher.publishVideoData(frame.flvTag.array(), frame.flvTag.size(), frame.dts); + mVideoAllocator.release(frame.flvTag); + mVideoFramesSent++; + } else if (frame.is_audio()) { + publisher.publishAudioData(frame.flvTag.array(), frame.flvTag.size(), frame.dts); + mAudioAllocator.release(frame.flvTag); + mAudioFramesSent++; + } + } + + /** + * start to the remote SRS for remux. + */ + public void start(final String rtmpUrl) { + worker = new Thread(new Runnable() { + @Override + public void run() { + android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_MORE_FAVORABLE); + if (!connect(rtmpUrl)) { + return; + } + reTries = numRetry; + connectCheckerRtmp.onConnectionSuccessRtmp(); + while (!Thread.interrupted()) { + try { + SrsFlvFrame frame = mFlvAudioTagCache.poll(1, TimeUnit.MILLISECONDS); + if (frame != null) { + if (frame.is_sequenceHeader()) { + mAudioSequenceHeader = frame; + } + sendFlvTag(frame); + } + + frame = mFlvVideoTagCache.poll(1, TimeUnit.MILLISECONDS); + if (frame != null) { + // video + if (frame.is_sequenceHeader()) { + mVideoSequenceHeader = frame; + } + sendFlvTag(frame); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } + }); + worker.start(); + } + + public void stop() { + stop(connectCheckerRtmp); + } + + /** + * stop the muxer, disconnect RTMP connection. + */ + private void stop(final ConnectCheckerRtmp connectCheckerRtmp) { + handler.removeCallbacks(runnable); + if (worker != null) { + worker.interrupt(); + try { + worker.join(100); + } catch (InterruptedException e) { + worker.interrupt(); + } + worker = null; + } + mFlvAudioTagCache.clear(); + mFlvVideoTagCache.clear(); + flv.reset(); + needToFindKeyFrame = true; + Log.i(TAG, "SrsFlvMuxer closed"); + + new Thread(new Runnable() { + @Override + public void run() { + disconnect(connectCheckerRtmp); + } + }).start(); + } + + public void sendVideo(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) { + flv.writeVideoSample(byteBuffer, bufferInfo); + } + + public void sendAudio(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) { + flv.writeAudioSample(byteBuffer, bufferInfo); + } + + // E.4.3.1 VIDEODATA + // Frame Type UB [4] + // Type of video frame. The following values are defined: + // 1 = key frame (for AVC, a seekable frame) + // 2 = inter frame (for AVC, a non-seekable frame) + // 3 = disposable inter frame (H.263 only) + // 4 = generated key frame (reserved for server use only) + // 5 = video info/command frame + private class SrsCodecVideoAVCFrame { + public final static int KeyFrame = 1; + public final static int InterFrame = 2; + } + + // AVCPacketType IF CodecID == 7 UI8 + // The following values are defined: + // 0 = AVC sequence header + // 1 = AVC NALU + // 2 = AVC end of sequence (lower level NALU sequence ender is + // not required or supported) + private class SrsCodecVideoAVCType { + public final static int SequenceHeader = 0; + public final static int NALU = 1; + } + + /** + * E.4.1 FLV Tag, page 75 + */ + private class SrsCodecFlvTag { + // 8 = audio + public final static int Audio = 8; + // 9 = video + public final static int Video = 9; + } + + private class AudioSampleRate { + public final static int R11025 = 11025; + public final static int R12000 = 12000; + public final static int R16000 = 16000; + public final static int R22050 = 22050; + public final static int R24000 = 24000; + public final static int R32000 = 32000; + public final static int R44100 = 44100; + public final static int R48000 = 48000; + public final static int R64000 = 64000; + public final static int R88200 = 88200; + public final static int R96000 = 96000; + } + + // E.4.3.1 VIDEODATA + // CodecID UB [4] + // Codec Identifier. The following values are defined: + // 2 = Sorenson H.263 + // 3 = Screen video + // 4 = On2 VP6 + // 5 = On2 VP6 with alpha channel + // 6 = Screen video version 2 + // 7 = AVC + private class SrsCodecVideo { + public final static int AVC = 7; + } + + /** + * the aac object type, for RTMP sequence header + * for AudioSpecificConfig, @see aac-mp4a-format-ISO_IEC_14496-3+2001.pdf, page 33 + * for audioObjectType, @see aac-mp4a-format-ISO_IEC_14496-3+2001.pdf, page 23 + */ + private class SrsAacObjectType { + public final static int AacLC = 2; + } + + /** + * Table 7-1 – NAL unit type codes, syntax element categories, and NAL unit type classes + * H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 83. + */ + private class SrsAvcNaluType { + // Unspecified + public final static int Reserved = 0; + + // Coded slice of a non-IDR picture slice_layer_without_partitioning_rbsp( ) + public final static int NonIDR = 1; + // Coded slice data partition A slice_data_partition_a_layer_rbsp( ) + public final static int DataPartitionA = 2; + // Coded slice data partition B slice_data_partition_b_layer_rbsp( ) + public final static int DataPartitionB = 3; + // Coded slice data partition C slice_data_partition_c_layer_rbsp( ) + public final static int DataPartitionC = 4; + // Coded slice of an IDR picture slice_layer_without_partitioning_rbsp( ) + public final static int IDR = 5; + // Supplemental enhancement information (SEI) sei_rbsp( ) + public final static int SEI = 6; + // Sequence parameter set seq_parameter_set_rbsp( ) + public final static int SPS = 7; + // Picture parameter set pic_parameter_set_rbsp( ) + public final static int PPS = 8; + // Access unit delimiter access_unit_delimiter_rbsp( ) + public final static int AccessUnitDelimiter = 9; + // End of sequence end_of_seq_rbsp( ) + public final static int EOSequence = 10; + // End of stream end_of_stream_rbsp( ) + public final static int EOStream = 11; + // Filler data filler_data_rbsp( ) + public final static int FilterData = 12; + // Sequence parameter set extension seq_parameter_set_extension_rbsp( ) + public final static int SPSExt = 13; + // Prefix NAL unit prefix_nal_unit_rbsp( ) + public final static int PrefixNALU = 14; + // Subset sequence parameter set subset_seq_parameter_set_rbsp( ) + public final static int SubsetSPS = 15; + // Coded slice of an auxiliary coded picture without partitioning slice_layer_without_partitioning_rbsp( ) + public final static int LayerWithoutPartition = 19; + // Coded slice extension slice_layer_extension_rbsp( ) + public final static int CodedSliceExt = 20; + } + + /** + * the search result for annexb. + */ + private class SrsAnnexbSearch { + public int nb_start_code = 0; + public boolean match = false; + } + + /** + * the demuxed tag frame. + */ + private class SrsFlvFrameBytes { + public ByteBuffer data; + public int size; + } + + /** + * the muxed flv frame. + */ + private class SrsFlvFrame { + // the tag bytes. + public SrsAllocator.Allocation flvTag; + // the codec type for audio/aac and video/avc for instance. + public int avc_aac_type; + // the frame type, keyframe or not. + public int frame_type; + // the tag type, audio, video or data. + public int type; + // the dts in ms, tbn is 1000. + public int dts; + + public boolean is_keyframe() { + return is_video() && frame_type == SrsCodecVideoAVCFrame.KeyFrame; + } + + public boolean is_sequenceHeader() { + return avc_aac_type == 0; + } + + public boolean is_video() { + return type == SrsCodecFlvTag.Video; + } + + public boolean is_audio() { + return type == SrsCodecFlvTag.Audio; + } + } + + /** + * the raw h.264 stream, in annexb. + */ + private class SrsRawH264Stream { + private final static String TAG = "SrsFlvMuxer"; + + private SrsAnnexbSearch annexb = new SrsAnnexbSearch(); + private SrsFlvFrameBytes nalu_header = new SrsFlvFrameBytes(); + private SrsFlvFrameBytes seq_hdr = new SrsFlvFrameBytes(); + private SrsFlvFrameBytes sps_hdr = new SrsFlvFrameBytes(); + private SrsFlvFrameBytes sps_bb = new SrsFlvFrameBytes(); + private SrsFlvFrameBytes pps_hdr = new SrsFlvFrameBytes(); + private SrsFlvFrameBytes pps_bb = new SrsFlvFrameBytes(); + + public boolean isSps(SrsFlvFrameBytes frame) { + return frame.size >= 1 && (frame.data.get(0) & 0x1f) == SrsAvcNaluType.SPS; + } + + public boolean isPps(SrsFlvFrameBytes frame) { + return frame.size >= 1 && (frame.data.get(0) & 0x1f) == SrsAvcNaluType.PPS; + } + + public SrsFlvFrameBytes muxNaluHeader(SrsFlvFrameBytes frame) { + if (nalu_header.data == null) { + nalu_header.data = ByteBuffer.allocate(4); + nalu_header.size = 4; + } + nalu_header.data.rewind(); + + // 5.3.4.2.1 Syntax, H.264-AVC-ISO_IEC_14496-15.pdf, page 16 + // lengthSizeMinusOne, or NAL_unit_length, always use 4bytes size + int NAL_unit_length = frame.size; + + // mux the avc NALU in "ISO Base Media File Format" + // from H.264-AVC-ISO_IEC_14496-15.pdf, page 20 + // NALUnitLength + nalu_header.data.putInt(NAL_unit_length); + + // reset the buffer. + nalu_header.data.rewind(); + return nalu_header; + } + + public void muxSequenceHeader(ByteBuffer sps, ByteBuffer pps, + ArrayList frames) { + // 5bytes sps/pps header: + // configurationVersion, AVCProfileIndication, profile_compatibility, + // AVCLevelIndication, lengthSizeMinusOne + // 3bytes size of sps: + // numOfSequenceParameterSets, sequenceParameterSetLength(2B) + // Nbytes of sps. + // sequenceParameterSetNALUnit + // 3bytes size of pps: + // numOfPictureParameterSets, pictureParameterSetLength + // Nbytes of pps: + // pictureParameterSetNALUnit + + // decode the SPS: + // @see: 7.3.2.1.1, H.264-AVC-ISO_IEC_14496-10-2012.pdf, page 62 + if (seq_hdr.data == null) { + seq_hdr.data = ByteBuffer.allocate(5); + seq_hdr.size = 5; + } + seq_hdr.data.rewind(); + // @see: Annex A Profiles and levels, H.264-AVC-ISO_IEC_14496-10.pdf, page 205 + // Baseline profile profile_idc is 66(0x42). + // Main profile profile_idc is 77(0x4d). + // Extended profile profile_idc is 88(0x58). + byte profile_idc = sps.get(1); + //u_int8_t constraint_set = frame[2]; + byte level_idc = sps.get(3); + + // generate the sps/pps header + // 5.3.4.2.1 Syntax, H.264-AVC-ISO_IEC_14496-15.pdf, page 16 + // configurationVersion + seq_hdr.data.put((byte) 0x01); + // AVCProfileIndication + seq_hdr.data.put(profile_idc); + // profile_compatibility + seq_hdr.data.put(profileIop); + // AVCLevelIndication + seq_hdr.data.put(level_idc); + // lengthSizeMinusOne, or NAL_unit_length, always use 4bytes size, + // so we always set it to 0x03. + seq_hdr.data.put((byte) 0x03); + + // reset the buffer. + seq_hdr.data.rewind(); + frames.add(seq_hdr); + + // sps + if (sps_hdr.data == null) { + sps_hdr.data = ByteBuffer.allocate(3); + sps_hdr.size = 3; + } + sps_hdr.data.rewind(); + // 5.3.4.2.1 Syntax, H.264-AVC-ISO_IEC_14496-15.pdf, page 16 + // numOfSequenceParameterSets, always 1 + sps_hdr.data.put((byte) 0x01); + // sequenceParameterSetLength + sps_hdr.data.putShort((short) sps.array().length); + + sps_hdr.data.rewind(); + frames.add(sps_hdr); + + // sequenceParameterSetNALUnit + sps_bb.size = sps.array().length; + sps_bb.data = sps.duplicate(); + frames.add(sps_bb); + + // pps + if (pps_hdr.data == null) { + pps_hdr.data = ByteBuffer.allocate(3); + pps_hdr.size = 3; + } + pps_hdr.data.rewind(); + // 5.3.4.2.1 Syntax, H.264-AVC-ISO_IEC_14496-15.pdf, page 16 + // numOfPictureParameterSets, always 1 + pps_hdr.data.put((byte) 0x01); + // pictureParameterSetLength + pps_hdr.data.putShort((short) pps.array().length); + + pps_hdr.data.rewind(); + frames.add(pps_hdr); + + // pictureParameterSetNALUnit + pps_bb.size = pps.array().length; + pps_bb.data = pps.duplicate(); + frames.add(pps_bb); + } + + public SrsAllocator.Allocation muxFlvTag(ArrayList frames, int frame_type, + int avc_packet_type) { + // for h264 in RTMP video payload, there is 5bytes header: + // 1bytes, FrameType | CodecID + // 1bytes, AVCPacketType + // 3bytes, CompositionTime, the cts. + // @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78 + int size = 5; + for (int i = 0; i < frames.size(); i++) { + size += frames.get(i).size; + } + SrsAllocator.Allocation allocation = mVideoAllocator.allocate(size); + + // @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78 + // Frame Type, Type of video frame. + // CodecID, Codec Identifier. + // set the rtmp header + allocation.put((byte) ((frame_type << 4) | SrsCodecVideo.AVC)); + + // AVCPacketType + allocation.put((byte) avc_packet_type); + + // CompositionTime + // pts = dts + cts, or + // cts = pts - dts. + // where cts is the header in rtmp video packet payload header. + int cts = 0; + allocation.put((byte) (cts >> 16)); + allocation.put((byte) (cts >> 8)); + allocation.put((byte) cts); + + // h.264 raw data. + for (int i = 0; i < frames.size(); i++) { + SrsFlvFrameBytes frame = frames.get(i); + frame.data.rewind(); + frame.data.get(allocation.array(), allocation.size(), frame.size); + allocation.appendOffset(frame.size); + } + + return allocation; + } + + private SrsAnnexbSearch searchStartcode(ByteBuffer bb, int size) { + annexb.match = false; + annexb.nb_start_code = 0; + if (size - 4 > 0) { + if (bb.get(0) == 0x00 && bb.get(1) == 0x00 && bb.get(2) == 0x00 && bb.get(3) == 0x01) { + // match N[00] 00 00 00 01, where N>=0 + annexb.match = true; + annexb.nb_start_code = 4; + } else if (bb.get(0) == 0x00 && bb.get(1) == 0x00 && bb.get(2) == 0x01) { + // match N[00] 00 00 01, where N>=0 + annexb.match = true; + annexb.nb_start_code = 3; + } + } + return annexb; + } + + private SrsAnnexbSearch searchAnnexb(ByteBuffer bb, int size) { + annexb.match = false; + annexb.nb_start_code = 0; + for (int i = bb.position(); i < size - 4; i++) { + // not match. + if (bb.get(i) != 0x00 || bb.get(i + 1) != 0x00) { + continue; + } + // match N[00] 00 00 01, where N>=0 + if (bb.get(i + 2) == 0x01) { + annexb.match = true; + annexb.nb_start_code = i + 3 - bb.position(); + break; + } + // match N[00] 00 00 00 01, where N>=0 + if (bb.get(i + 2) == 0x00 && bb.get(i + 3) == 0x01) { + annexb.match = true; + annexb.nb_start_code = i + 4 - bb.position(); + break; + } + } + return annexb; + } + + public SrsFlvFrameBytes demuxAnnexb(ByteBuffer bb, int size, boolean isOnlyChkHeader) { + SrsFlvFrameBytes tbb = new SrsFlvFrameBytes(); + if (bb.position() < size - 4) { + // each frame must prefixed by annexb format. + // about annexb, @see H.264-AVC-ISO_IEC_14496-10.pdf, page 211. + SrsAnnexbSearch tbbsc = + isOnlyChkHeader ? searchStartcode(bb, size) : searchAnnexb(bb, size); + // tbbsc.nb_start_code always 4 , after 00 00 00 01 + if (!tbbsc.match || tbbsc.nb_start_code < 3) { + Log.e(TAG, "annexb not match."); + } else { + // the start codes. + for (int i = 0; i < tbbsc.nb_start_code; i++) { + bb.get(); + } + + // find out the frame size. + tbb.data = bb.slice(); + tbb.size = size - bb.position(); + } + } + return tbb; + } + } + + /** + * remux the annexb to flv tags. + */ + private class SrsFlv { + private SrsRawH264Stream avc = new SrsRawH264Stream(); + private ArrayList ipbs = new ArrayList<>(); + private SrsAllocator.Allocation audio_tag; + private SrsAllocator.Allocation video_tag; + private ByteBuffer Sps; + private ByteBuffer Pps; + private boolean aac_specific_config_got; + private int achannel; + + public SrsFlv() { + reset(); + } + + public void setAchannel(int achannel) { + this.achannel = achannel; + } + + public void reset() { + Sps = null; + Pps = null; + isPpsSpsSend = false; + aac_specific_config_got = false; + } + + public void writeAudioSample(final ByteBuffer bb, MediaCodec.BufferInfo bi) { + int dts = (int) (bi.presentationTimeUs / 1000); + + audio_tag = mAudioAllocator.allocate(bi.size + 2); + byte aac_packet_type = 1; // 1 = AAC raw + if (!aac_specific_config_got) { + // @see aac-mp4a-format-ISO_IEC_14496-3+2001.pdf + // AudioSpecificConfig (), page 33 + // 1.6.2.1 AudioSpecificConfig + // audioObjectType; 5 bslbf + byte ch = (byte) (bi.flags == MediaCodec.BUFFER_FLAG_CODEC_CONFIG ? bb.get(0) & 0xf8 + : (bb.get(0) & 0xf8) / 2); + // 3bits left. + + // samplingFrequencyIndex; 4 bslbf + // For the values refer to https://wiki.multimedia.cx/index.php/MPEG-4_Audio#Sampling_Frequencies + byte samplingFrequencyIndex; + switch (sampleRate) { + case AudioSampleRate.R96000: + samplingFrequencyIndex = 0x00; + break; + case AudioSampleRate.R88200: + samplingFrequencyIndex = 0x01; + break; + case AudioSampleRate.R64000: + samplingFrequencyIndex = 0x02; + break; + case AudioSampleRate.R48000: + samplingFrequencyIndex = 0x03; + break; + case AudioSampleRate.R44100: + samplingFrequencyIndex = 0x04; + break; + case AudioSampleRate.R32000: + samplingFrequencyIndex = 0x05; + break; + case AudioSampleRate.R24000: + samplingFrequencyIndex = 0x06; + break; + case AudioSampleRate.R22050: + samplingFrequencyIndex = 0x07; + break; + case AudioSampleRate.R16000: + samplingFrequencyIndex = 0x08; + break; + case AudioSampleRate.R12000: + samplingFrequencyIndex = 0x09; + break; + case AudioSampleRate.R11025: + samplingFrequencyIndex = 0x0a; + break; + default: + // 44100 Hz shall be the fallback value when sampleRate is irregular. + // not implemented: other sample rates might be possible with samplingFrequencyIndex = 0x0f. + samplingFrequencyIndex = 0x04; // 4: 44100 Hz + } + ch |= (samplingFrequencyIndex >> 1) & 0x07; + audio_tag.put(ch, 2); + + ch = (byte) ((samplingFrequencyIndex << 7) & 0x80); + // 7bits left. + + // channelConfiguration; 4 bslbf + byte channelConfiguration = 1; + if (achannel == 2) { + channelConfiguration = 2; + } + ch |= (channelConfiguration << 3) & 0x78; + // 3bits left. + + // GASpecificConfig(), page 451 + // 4.4.1 Decoder configuration (GASpecificConfig) + // frameLengthFlag; 1 bslbf + // dependsOnCoreCoder; 1 bslbf + // extensionFlag; 1 bslbf + audio_tag.put(ch, 3); + + aac_specific_config_got = true; + aac_packet_type = 0; // 0 = AAC sequence header + + writeAdtsHeader(audio_tag.array(), 4); + audio_tag.appendOffset(7); + } else { + bb.get(audio_tag.array(), 2, bi.size); + audio_tag.appendOffset(bi.size + 2); + } + + byte sound_format = 10; // AAC + byte sound_type = 0; // 0 = Mono sound + if (achannel == 2) { + sound_type = 1; // 1 = Stereo sound + } + byte sound_size = 1; // 1 = 16-bit samples + byte sound_rate = 3; // 44100, 22050, 11025 + if (sampleRate == 22050) { + sound_rate = 2; + } else if (sampleRate == 11025) { + sound_rate = 1; + } + + // for audio frame, there is 1 or 2 bytes header: + // 1bytes, SoundFormat|SoundRate|SoundSize|SoundType + // 1bytes, AACPacketType for SoundFormat == 10, 0 is sequence header. + byte audio_header = (byte) (sound_type & 0x01); + audio_header |= (sound_size << 1) & 0x02; + audio_header |= (sound_rate << 2) & 0x0c; + audio_header |= (sound_format << 4) & 0xf0; + + audio_tag.put(audio_header, 0); + audio_tag.put(aac_packet_type, 1); + writeRtmpPacket(SrsCodecFlvTag.Audio, dts, 0, aac_packet_type, audio_tag); + } + + private void writeAdtsHeader(byte[] frame, int offset) { + // adts sync word 0xfff (12-bit) + frame[offset] = (byte) 0xff; + frame[offset + 1] = (byte) 0xf0; + // version 0 for MPEG-4, 1 for MPEG-2 (1-bit) + frame[offset + 1] |= 0 << 3; + // layer 0 (2-bit) + frame[offset + 1] |= 0 << 1; + // protection absent: 1 (1-bit) + frame[offset + 1] |= 1; + // profile: audio_object_type - 1 (2-bit) + frame[offset + 2] = (SrsAacObjectType.AacLC - 1) << 6; + // sampling frequency index: 4 (4-bit) + frame[offset + 2] |= (4 & 0xf) << 2; + // channel configuration (3-bit) + frame[offset + 2] |= (2 & (byte) 0x4) >> 2; + frame[offset + 3] = (byte) ((2 & (byte) 0x03) << 6); + // original: 0 (1-bit) + frame[offset + 3] |= 0 << 5; + // home: 0 (1-bit) + frame[offset + 3] |= 0 << 4; + // copyright id bit: 0 (1-bit) + frame[offset + 3] |= 0 << 3; + // copyright id start: 0 (1-bit) + frame[offset + 3] |= 0 << 2; + // frame size (13-bit) + frame[offset + 3] |= ((frame.length - 2) & 0x1800) >> 11; + frame[offset + 4] = (byte) (((frame.length - 2) & 0x7f8) >> 3); + frame[offset + 5] = (byte) (((frame.length - 2) & 0x7) << 5); + // buffer fullness (0x7ff for variable bitrate) + frame[offset + 5] |= (byte) 0x1f; + frame[offset + 6] = (byte) 0xfc; + // number of data block (nb - 1) + frame[offset + 6] |= 0x0; + } + + public void writeVideoSample(final ByteBuffer bb, MediaCodec.BufferInfo bi) { + if (bi.size < 4) return; + + bb.rewind(); //Sometimes the position is not 0. + int pts = (int) (bi.presentationTimeUs / 1000); + int type = SrsCodecVideoAVCFrame.InterFrame; + SrsFlvFrameBytes frame = avc.demuxAnnexb(bb, bi.size, true); + int nal_unit_type = frame.data.get(0) & 0x1f; + if (nal_unit_type == SrsAvcNaluType.IDR || bi.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME) { + type = SrsCodecVideoAVCFrame.KeyFrame; + } else if (nal_unit_type == SrsAvcNaluType.SPS || nal_unit_type == SrsAvcNaluType.PPS) { + SrsFlvFrameBytes frame_pps = avc.demuxAnnexb(bb, bi.size, false); + frame.size = frame.size - frame_pps.size - 4; // 4 ---> 00 00 00 01 pps + if (!frame.data.equals(Sps)) { + byte[] sps = new byte[frame.size]; + frame.data.get(sps); + isPpsSpsSend = false; + Sps = ByteBuffer.wrap(sps); + } + + SrsFlvFrameBytes frame_sei = avc.demuxAnnexb(bb, bi.size, false); + if (frame_sei.size > 0) { + if (SrsAvcNaluType.SEI == (frame_sei.data.get(0) & 0x1f)) { + frame_pps.size = frame_pps.size - frame_sei.size - 3;// 3 ---> 00 00 01 SEI + } + } + + if (frame_pps.size > 0 && !frame_pps.data.equals(Pps)) { + byte[] pps = new byte[frame_pps.size]; + frame_pps.data.get(pps); + isPpsSpsSend = false; + Pps = ByteBuffer.wrap(pps); + writeH264SpsPps(pts); + } + return; + } else if (nal_unit_type != SrsAvcNaluType.NonIDR) { + return; + } + + ipbs.add(avc.muxNaluHeader(frame)); + ipbs.add(frame); + + writeH264IpbFrame(ipbs, type, pts); + ipbs.clear(); + } + + public void setSpsPPs(ByteBuffer sps, ByteBuffer pps) { + Sps = sps; + Pps = pps; + } + + private void writeH264SpsPps(int pts) { + // when not got sps/pps, wait. + if (Pps == null || Sps == null || isPpsSpsSend) { + return; + } + + // h264 raw to h264 packet. + ArrayList frames = new ArrayList<>(); + avc.muxSequenceHeader(Sps, Pps, frames); + + // h264 packet to flv packet. + int frame_type = SrsCodecVideoAVCFrame.KeyFrame; + int avc_packet_type = SrsCodecVideoAVCType.SequenceHeader; + video_tag = avc.muxFlvTag(frames, frame_type, avc_packet_type); + + isPpsSpsSend = true; + // the timestamp in rtmp message header is dts. + writeRtmpPacket(SrsCodecFlvTag.Video, pts, frame_type, avc_packet_type, video_tag); + Log.i(TAG, String.format("flv: h264 sps/pps sent, sps=%dB, pps=%dB", Sps.array().length, + Pps.array().length)); + } + + private void writeH264IpbFrame(ArrayList frames, int frame_type, int dts) { + // when sps or pps not sent, ignore the packet. + // @see https://github.com/simple-rtmp-server/srs/issues/203 + if (Pps == null || Sps == null) { + return; + } + video_tag = avc.muxFlvTag(frames, frame_type, SrsCodecVideoAVCType.NALU); + // the timestamp in rtmp message header is dts. + writeRtmpPacket(SrsCodecFlvTag.Video, dts, frame_type, SrsCodecVideoAVCType.NALU, video_tag); + } + + private void writeRtmpPacket(int type, int dts, int frame_type, int avc_aac_type, + SrsAllocator.Allocation tag) { + SrsFlvFrame frame = new SrsFlvFrame(); + frame.flvTag = tag; + frame.type = type; + frame.dts = dts; + frame.frame_type = frame_type; + frame.avc_aac_type = avc_aac_type; + if (frame.is_video()) { + if (needToFindKeyFrame) { + if (frame.is_keyframe()) { + needToFindKeyFrame = false; + flvFrameCacheAdd(frame); + } + } else { + flvFrameCacheAdd(frame); + } + } else if (frame.is_audio()) { + flvFrameCacheAdd(frame); + } + } + + private void flvFrameCacheAdd(SrsFlvFrame frame) { + try { + if(frame.is_video()) { + mFlvVideoTagCache.add(frame); + } else { + mFlvAudioTagCache.add(frame); + } + } catch (IllegalStateException e) { + Log.i(TAG, "frame discarded"); + if (frame.is_video()) { + mDroppedVideoFrames++; + } else { + mDroppedAudioFrames++; + } + } + } + } +} diff --git a/rtmp/src/main/java/net/ossrs/rtmp/TLSSocketFactory.java b/rtmp/src/main/java/net/ossrs/rtmp/TLSSocketFactory.java new file mode 100644 index 0000000..5ba5ba1 --- /dev/null +++ b/rtmp/src/main/java/net/ossrs/rtmp/TLSSocketFactory.java @@ -0,0 +1,78 @@ +package net.ossrs.rtmp; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.net.UnknownHostException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +/** + * @author fkrauthan + */ +public class TLSSocketFactory extends SSLSocketFactory { + + private SSLSocketFactory internalSSLSocketFactory; + + public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException { + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, null, null); + internalSSLSocketFactory = context.getSocketFactory(); + } + + @Override + public String[] getDefaultCipherSuites() { + return internalSSLSocketFactory.getDefaultCipherSuites(); + } + + @Override + public String[] getSupportedCipherSuites() { + return internalSSLSocketFactory.getSupportedCipherSuites(); + } + + @Override + public Socket createSocket() throws IOException { + return enableTLSOnSocket(internalSSLSocketFactory.createSocket()); + } + + @Override + public Socket createSocket(Socket s, String host, int port, boolean autoClose) + throws IOException { + return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)); + } + + @Override + public Socket createSocket(String host, int port) throws IOException, UnknownHostException { + return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); + } + + @Override + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) + throws IOException, UnknownHostException { + return enableTLSOnSocket( + internalSSLSocketFactory.createSocket(host, port, localHost, localPort)); + } + + @Override + public Socket createSocket(InetAddress host, int port) throws IOException { + return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); + } + + @Override + public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) + throws IOException { + return enableTLSOnSocket( + internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)); + } + + private Socket enableTLSOnSocket(Socket socket) { + if (socket != null && (socket instanceof SSLSocket)) { + ((SSLSocket) socket).setEnabledProtocols(new String[] { "TLSv1.1", "TLSv1.2" }); + } + return socket; + } +} diff --git a/rtplibrary/.gitignore b/rtplibrary/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/rtplibrary/.gitignore @@ -0,0 +1 @@ +/build diff --git a/rtplibrary/build.gradle b/rtplibrary/build.gradle new file mode 100644 index 0000000..b7158d0 --- /dev/null +++ b/rtplibrary/build.gradle @@ -0,0 +1,24 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 30 + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 30 + versionCode 182 + versionName "1.8.2" + } + buildTypes { + release { + minifyEnabled false + consumerProguardFiles 'proguard-rules.pro' + } + } +} + +dependencies { + api project(':encoder') + api project(':rtmp') + api project(':rtsp') +} diff --git a/rtplibrary/proguard-rules.pro b/rtplibrary/proguard-rules.pro new file mode 100644 index 0000000..eb15854 --- /dev/null +++ b/rtplibrary/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /home/pedro/Android/Sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/rtplibrary/src/main/AndroidManifest.xml b/rtplibrary/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2a5f25e --- /dev/null +++ b/rtplibrary/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera1Base.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera1Base.java new file mode 100644 index 0000000..18dbdcf --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera1Base.java @@ -0,0 +1,778 @@ +package com.pedro.rtplibrary.base; + +import android.content.Context; +import android.hardware.Camera; +import android.media.MediaCodec; +import android.media.MediaFormat; +import android.os.Build; +import android.util.Log; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.TextureView; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.Frame; +import com.pedro.encoder.audio.AudioEncoder; +import com.pedro.encoder.audio.GetAacData; +import com.pedro.encoder.input.audio.CustomAudioEffect; +import com.pedro.encoder.input.audio.GetMicrophoneData; +import com.pedro.encoder.input.audio.MicrophoneManager; +import com.pedro.encoder.input.video.Camera1ApiManager; +import com.pedro.encoder.input.video.CameraHelper; +import com.pedro.encoder.input.video.CameraOpenException; +import com.pedro.encoder.input.video.GetCameraData; +import com.pedro.encoder.utils.CodecUtil; +import com.pedro.encoder.video.FormatVideoEncoder; +import com.pedro.encoder.video.GetVideoData; +import com.pedro.encoder.video.VideoEncoder; +import com.pedro.rtplibrary.util.FpsListener; +import com.pedro.rtplibrary.util.RecordController; +import com.pedro.rtplibrary.view.GlInterface; +import com.pedro.rtplibrary.view.LightOpenGlView; +import com.pedro.rtplibrary.view.OffScreenGlThread; +import com.pedro.rtplibrary.view.OpenGlView; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.List; + +/** + * Wrapper to stream with camera1 api and microphone. Support stream with SurfaceView, TextureView + * and OpenGlView(Custom SurfaceView that use OpenGl). SurfaceView and TextureView use buffer to + * buffer encoding mode for H264 and OpenGlView use Surface to buffer mode(This mode is generally + * better because skip buffer processing). + * + * API requirements: + * SurfaceView and TextureView mode: API 16+. + * OpenGlView: API 18+. + * + * Created by pedro on 7/07/17. + */ + +public abstract class Camera1Base + implements GetAacData, GetCameraData, GetVideoData, GetMicrophoneData { + + private static final String TAG = "Camera1Base"; + + private Context context; + private Camera1ApiManager cameraManager; + protected VideoEncoder videoEncoder; + private MicrophoneManager microphoneManager; + private AudioEncoder audioEncoder; + private GlInterface glInterface; + private boolean streaming = false; + private boolean videoEnabled = true; + private boolean onPreview = false; + private RecordController recordController; + private int previewWidth, previewHeight; + private FpsListener fpsListener = new FpsListener(); + + public Camera1Base(SurfaceView surfaceView) { + context = surfaceView.getContext(); + cameraManager = new Camera1ApiManager(surfaceView, this); + init(); + } + + public Camera1Base(TextureView textureView) { + context = textureView.getContext(); + cameraManager = new Camera1ApiManager(textureView, this); + init(); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public Camera1Base(OpenGlView openGlView) { + context = openGlView.getContext(); + this.glInterface = openGlView; + this.glInterface.init(); + cameraManager = new Camera1ApiManager(glInterface.getSurfaceTexture(), context); + init(); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public Camera1Base(LightOpenGlView lightOpenGlView) { + context = lightOpenGlView.getContext(); + this.glInterface = lightOpenGlView; + this.glInterface.init(); + cameraManager = new Camera1ApiManager(glInterface.getSurfaceTexture(), context); + init(); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public Camera1Base(Context context) { + this.context = context; + glInterface = new OffScreenGlThread(context); + glInterface.init(); + cameraManager = new Camera1ApiManager(glInterface.getSurfaceTexture(), context); + init(); + } + + private void init() { + videoEncoder = new VideoEncoder(this); + microphoneManager = new MicrophoneManager(this); + audioEncoder = new AudioEncoder(this); + recordController = new RecordController(); + } + + /** + * Set an audio effect modifying microphone's PCM buffer. + */ + public void setCustomAudioEffect(CustomAudioEffect customAudioEffect) { + microphoneManager.setCustomAudioEffect(customAudioEffect); + } + + /** + * @param callback get fps while record or stream + */ + public void setFpsListener(FpsListener.Callback callback) { + fpsListener.setCallback(callback); + } + + /** + * Experimental + */ + public void enableFaceDetection(Camera1ApiManager.FaceDetectorCallback faceDetectorCallback) { + cameraManager.enableFaceDetection(faceDetectorCallback); + } + + /** + * Experimental + */ + public void disableFaceDetection() { + cameraManager.disableFaceDetection(); + } + + /** + * Experimental + */ + public boolean isFaceDetectionEnabled() { + return cameraManager.isFaceDetectionEnabled(); + } + + public boolean isFrontCamera() { + return cameraManager.isFrontCamera(); + } + + public void enableLantern() throws Exception { + cameraManager.enableLantern(); + } + + public void disableLantern() { + cameraManager.disableLantern(); + } + + public boolean isLanternEnabled() { + return cameraManager.isLanternEnabled(); + } + + /** + * Basic auth developed to work with Wowza. No tested with other server + * + * @param user auth. + * @param password auth. + */ + public abstract void setAuthorization(String user, String password); + + /** + * Call this method before use @startStream. If not you will do a stream without video. NOTE: + * Rotation with encoder is silence ignored in some devices. + * + * @param width resolution in px. + * @param height resolution in px. + * @param fps frames per second of the stream. + * @param bitrate H264 in bps. + * @param hardwareRotation true if you want rotate using encoder, false if you want rotate with + * software if you are using a SurfaceView or TextureView or with OpenGl if you are using + * OpenGlView. + * @param rotation could be 90, 180, 270 or 0. You should use CameraHelper.getCameraOrientation + * with SurfaceView or TextureView and 0 with OpenGlView or LightOpenGlView. NOTE: Rotation with + * encoder is silence ignored in some devices. + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a H264 encoder). + */ + public boolean prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation, + int iFrameInterval, int rotation, int avcProfile, int avcProfileLevel) { + if (onPreview && width != previewWidth || height != previewHeight) { + stopPreview(); + onPreview = true; + } + FormatVideoEncoder formatVideoEncoder = + glInterface == null ? FormatVideoEncoder.YUV420Dynamical : FormatVideoEncoder.SURFACE; + return videoEncoder.prepareVideoEncoder(width, height, fps, bitrate, rotation, hardwareRotation, + iFrameInterval, formatVideoEncoder, avcProfile, avcProfileLevel); + } + + /** + * backward compatibility reason + */ + public boolean prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation, + int iFrameInterval, int rotation) { + return prepareVideo(width, height, fps, bitrate, hardwareRotation, iFrameInterval, rotation, + -1, -1); + } + + public boolean prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation, + int rotation) { + return prepareVideo(width, height, fps, bitrate, hardwareRotation, 2, rotation); + } + + protected abstract void prepareAudioRtp(boolean isStereo, int sampleRate); + + /** + * Call this method before use @startStream. If not you will do a stream without audio. + * + * @param bitrate AAC in kb. + * @param sampleRate of audio in hz. Can be 8000, 16000, 22500, 32000, 44100. + * @param isStereo true if you want Stereo audio (2 audio channels), false if you want Mono audio + * (1 audio channel). + * @param echoCanceler true enable echo canceler, false disable. + * @param noiseSuppressor true enable noise suppressor, false disable. + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a AAC encoder). + */ + public boolean prepareAudio(int bitrate, int sampleRate, boolean isStereo, boolean echoCanceler, + boolean noiseSuppressor) { + microphoneManager.createMicrophone(sampleRate, isStereo, echoCanceler, noiseSuppressor); + prepareAudioRtp(isStereo, sampleRate); + return audioEncoder.prepareAudioEncoder(bitrate, sampleRate, isStereo, + microphoneManager.getMaxInputSize()); + } + + /** + * Same to call: rotation = 0; if (Portrait) rotation = 90; prepareVideo(640, 480, 30, 1200 * + * 1024, false, rotation); + * + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a H264 encoder). + */ + public boolean prepareVideo() { + int rotation = CameraHelper.getCameraOrientation(context); + return prepareVideo(640, 480, 30, 1200 * 1024, false, rotation); + } + + /** + * Same to call: prepareAudio(64 * 1024, 32000, true, false, false); + * + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a AAC encoder). + */ + public boolean prepareAudio() { + return prepareAudio(64 * 1024, 32000, true, false, false); + } + + /** + * @param forceVideo force type codec used. FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE + * @param forceAudio force type codec used. FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE + */ + public void setForce(CodecUtil.Force forceVideo, CodecUtil.Force forceAudio) { + videoEncoder.setForce(forceVideo); + audioEncoder.setForce(forceAudio); + } + + /** + * Start record a MP4 video. Need be called while stream. + * + * @param path where file will be saved. + * @throws IOException If you init it before start stream. + */ + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public void startRecord(final String path, RecordController.Listener listener) + throws IOException { + recordController.startRecord(path, listener); + if (!streaming) { + startEncoders(); + } else if (videoEncoder.isRunning()) { + resetVideoEncoder(); + } + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public void startRecord(final String path) throws IOException { + startRecord(path, null); + } + + /** + * Stop record MP4 video started with @startRecord. If you don't call it file will be unreadable. + */ + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public void stopRecord() { + recordController.stopRecord(); + if (!streaming) stopStream(); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public void replaceView(Context context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + replaceGlInterface(new OffScreenGlThread(context)); + } + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public void replaceView(OpenGlView openGlView) { + replaceGlInterface(openGlView); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public void replaceView(LightOpenGlView lightOpenGlView) { + replaceGlInterface(lightOpenGlView); + } + + /** + * Replace glInterface used on fly. Ignored if you use SurfaceView or TextureView + */ + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + private void replaceGlInterface(GlInterface glInterface) { + if (this.glInterface != null && Build.VERSION.SDK_INT >= 18) { + if (isStreaming() || isRecording() || isOnPreview()) { + cameraManager.stop(); + this.glInterface.removeMediaCodecSurface(); + this.glInterface.stop(); + this.glInterface = glInterface; + this.glInterface.init(); + boolean isPortrait = CameraHelper.isPortrait(context); + if (isPortrait) { + this.glInterface.setEncoderSize(videoEncoder.getHeight(), videoEncoder.getWidth()); + } else { + this.glInterface.setEncoderSize(videoEncoder.getWidth(), videoEncoder.getHeight()); + } + this.glInterface.setRotation(0); + this.glInterface.start(); + if (isStreaming() || isRecording()) { + this.glInterface.addMediaCodecSurface(videoEncoder.getInputSurface()); + } + cameraManager.setSurfaceTexture(glInterface.getSurfaceTexture()); + cameraManager.setRotation(videoEncoder.getRotation()); + cameraManager.start(videoEncoder.getWidth(), videoEncoder.getHeight(), + videoEncoder.getFps()); + } else { + this.glInterface = glInterface; + } + } + } + + /** + * Start camera preview. Ignored, if stream or preview is started. + * + * @param cameraFacing front or back camera. Like: {@link com.pedro.encoder.input.video.CameraHelper.Facing#BACK} + * {@link com.pedro.encoder.input.video.CameraHelper.Facing#FRONT} + * @param width of preview in px. + * @param height of preview in px. + * @param rotation camera rotation (0, 90, 180, 270). Recommended: {@link + * com.pedro.encoder.input.video.CameraHelper#getCameraOrientation(Context)} + */ + public void startPreview(CameraHelper.Facing cameraFacing, int width, int height, int rotation) { + if (!isStreaming() && !onPreview && !(glInterface instanceof OffScreenGlThread)) { + previewWidth = width; + previewHeight = height; + if (glInterface != null && Build.VERSION.SDK_INT >= 18) { + boolean isPortrait = CameraHelper.isPortrait(context); + if (isPortrait) { + glInterface.setEncoderSize(height, width); + } else { + glInterface.setEncoderSize(width, height); + } + glInterface.setRotation(0); + glInterface.start(); + cameraManager.setSurfaceTexture(glInterface.getSurfaceTexture()); + } + cameraManager.setRotation(rotation); + cameraManager.start(cameraFacing, width, height, videoEncoder.getFps()); + onPreview = true; + } else { + Log.e(TAG, "Streaming or preview started, ignored"); + } + } + + public void startPreview(CameraHelper.Facing cameraFacing, int width, int height) { + startPreview(cameraFacing, width, height, CameraHelper.getCameraOrientation(context)); + } + + public void startPreview(CameraHelper.Facing cameraFacing) { + startPreview(cameraFacing, 640, 480); + } + + public void startPreview(int width, int height) { + startPreview(CameraHelper.Facing.BACK, width, height); + } + + public void startPreview() { + startPreview(CameraHelper.Facing.BACK); + } + + /** + * Stop camera preview. Ignored if streaming or already stopped. You need call it after + * + * @stopStream to release camera properly if you will close activity. + */ + public void stopPreview() { + if (!isStreaming() + && !isRecording() + && onPreview + && !(glInterface instanceof OffScreenGlThread)) { + if (glInterface != null && Build.VERSION.SDK_INT >= 18) { + glInterface.stop(); + } + cameraManager.stop(); + onPreview = false; + previewWidth = 0; + previewHeight = 0; + } else { + Log.e(TAG, "Streaming or preview stopped, ignored"); + } + } + + /** + * Change preview orientation can be called while stream. + * + * @param orientation of the camera preview. Could be 90, 180, 270 or 0. + */ + public void setPreviewOrientation(int orientation) { + cameraManager.setPreviewOrientation(orientation); + } + + /** + * Set zoomIn or zoomOut to camera. + * + * @param event motion event. Expected to get event.getPointerCount() > 1 + */ + public void setZoom(MotionEvent event) { + cameraManager.setZoom(event); + } + + protected abstract void startStreamRtp(String url); + + /** + * Need be called after @prepareVideo or/and @prepareAudio. This method override resolution of + * + * @param url of the stream like: protocol://ip:port/application/streamName + * + * RTSP: rtsp://192.168.1.1:1935/live/pedroSG94 RTSPS: rtsps://192.168.1.1:1935/live/pedroSG94 + * RTMP: rtmp://192.168.1.1:1935/live/pedroSG94 RTMPS: rtmps://192.168.1.1:1935/live/pedroSG94 + * @startPreview to resolution seated in @prepareVideo. If you never startPreview this method + * startPreview for you to resolution seated in @prepareVideo. + */ + public void startStream(String url) { + streaming = true; + if (!recordController.isRunning()) { + startEncoders(); + } else { + resetVideoEncoder(); + } + startStreamRtp(url); + onPreview = true; + } + + private void startEncoders() { + videoEncoder.start(); + audioEncoder.start(); + prepareGlView(); + microphoneManager.start(); + cameraManager.setRotation(videoEncoder.getRotation()); + if (!cameraManager.isRunning() && videoEncoder.getWidth() != previewWidth + || videoEncoder.getHeight() != previewHeight) { + cameraManager.start(videoEncoder.getWidth(), videoEncoder.getHeight(), videoEncoder.getFps()); + } + onPreview = true; + } + + private void resetVideoEncoder() { + if (glInterface != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + glInterface.removeMediaCodecSurface(); + } + videoEncoder.reset(); + if (glInterface != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + glInterface.addMediaCodecSurface(videoEncoder.getInputSurface()); + } + } + + private void prepareGlView() { + if (glInterface != null && Build.VERSION.SDK_INT >= 18) { + if (glInterface instanceof OffScreenGlThread) { + glInterface = new OffScreenGlThread(context); + glInterface.init(); + } + glInterface.setFps(videoEncoder.getFps()); + if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) { + glInterface.setEncoderSize(videoEncoder.getHeight(), videoEncoder.getWidth()); + } else { + glInterface.setEncoderSize(videoEncoder.getWidth(), videoEncoder.getHeight()); + } + glInterface.setRotation(0); + if (!cameraManager.isRunning() && videoEncoder.getWidth() != previewWidth + || videoEncoder.getHeight() != previewHeight) { + glInterface.start(); + } + if (videoEncoder.getInputSurface() != null) { + glInterface.addMediaCodecSurface(videoEncoder.getInputSurface()); + } + cameraManager.setSurfaceTexture(glInterface.getSurfaceTexture()); + } + } + + protected abstract void stopStreamRtp(); + + /** + * Stop stream started with @startStream. + */ + public void stopStream() { + if (streaming) { + streaming = false; + stopStreamRtp(); + } + if (!recordController.isRecording()) { + microphoneManager.stop(); + if (glInterface != null && Build.VERSION.SDK_INT >= 18) { + glInterface.removeMediaCodecSurface(); + if (glInterface instanceof OffScreenGlThread) { + glInterface.stop(); + cameraManager.stop(); + } + } + videoEncoder.stop(); + audioEncoder.stop(); + recordController.resetFormats(); + } + } + + public boolean reTry(long delay, String reason) { + boolean result = shouldRetry(reason); + if (result) { + reTry(delay); + } + return result; + } + + /** + * Replace with reTry(long delay, String reason); + */ + @Deprecated + public void reTry(long delay) { + resetVideoEncoder(); + reConnect(delay); + } + + /** + * Replace with reTry(long delay, String reason); + */ + @Deprecated + public abstract boolean shouldRetry(String reason); + + public abstract void setReTries(int reTries); + + protected abstract void reConnect(long delay); + + //cache control + public abstract void resizeCache(int newSize) throws RuntimeException; + + public abstract int getCacheSize(); + + public abstract long getSentAudioFrames(); + + public abstract long getSentVideoFrames(); + + public abstract long getDroppedAudioFrames(); + + public abstract long getDroppedVideoFrames(); + + public abstract void resetSentAudioFrames(); + + public abstract void resetSentVideoFrames(); + + public abstract void resetDroppedAudioFrames(); + + public abstract void resetDroppedVideoFrames(); + + /** + * Get supported preview resolutions of back camera in px. + * + * @return list of preview resolutions supported by back camera + */ + public List getResolutionsBack() { + return cameraManager.getPreviewSizeBack(); + } + + /** + * Get supported preview resolutions of front camera in px. + * + * @return list of preview resolutions supported by front camera + */ + public List getResolutionsFront() { + return cameraManager.getPreviewSizeFront(); + } + + /** + * Mute microphone, can be called before, while and after stream. + */ + public void disableAudio() { + microphoneManager.mute(); + } + + /** + * Enable a muted microphone, can be called before, while and after stream. + */ + public void enableAudio() { + microphoneManager.unMute(); + } + + /** + * Get mute state of microphone. + * + * @return true if muted, false if enabled + */ + public boolean isAudioMuted() { + return microphoneManager.isMuted(); + } + + /** + * Get video camera state + * + * @return true if disabled, false if enabled + */ + public boolean isVideoEnabled() { + return videoEnabled; + } + + public int getBitrate() { + return videoEncoder.getBitRate(); + } + + public int getResolutionValue() { + return videoEncoder.getWidth() * videoEncoder.getHeight(); + } + + public int getStreamWidth() { + return videoEncoder.getWidth(); + } + + public int getStreamHeight() { + return videoEncoder.getHeight(); + } + + /** + * Switch camera used. Can be called on preview or while stream, ignored with preview off. + * + * @throws CameraOpenException If the other camera doesn't support same resolution. + */ + public void switchCamera() throws CameraOpenException { + if (isStreaming() || onPreview) { + cameraManager.switchCamera(); + } + } + + public GlInterface getGlInterface() { + if (glInterface != null) { + return glInterface; + } else { + throw new RuntimeException("You can't do it. You are not using Opengl"); + } + } + + /** + * Set video bitrate of H264 in bits per second while stream. + * + * @param bitrate H264 in bits per second. + */ + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + public void setVideoBitrateOnFly(int bitrate) { + videoEncoder.setVideoBitrateOnFly(bitrate); + } + + /** + * Set limit FPS while stream. This will be override when you call to prepareVideo method. This + * could produce a change in iFrameInterval. + * + * @param fps frames per second + */ + public void setLimitFPSOnFly(int fps) { + videoEncoder.setFps(fps); + } + + /** + * Get stream state. + * + * @return true if streaming, false if not streaming. + */ + public boolean isStreaming() { + return streaming; + } + + /** + * Get preview state. + * + * @return true if enabled, false if disabled. + */ + public boolean isOnPreview() { + return onPreview; + } + + /** + * Get record state. + * + * @return true if recording, false if not recoding. + */ + public boolean isRecording() { + return recordController.isRunning(); + } + + public void pauseRecord() { + recordController.pauseRecord(); + } + + public void resumeRecord() { + recordController.resumeRecord(); + } + + public RecordController.Status getRecordStatus() { + return recordController.getStatus(); + } + + protected abstract void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info); + + @Override + public void getAacData(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + recordController.recordAudio(aacBuffer, info); + } + if (streaming) getAacDataRtp(aacBuffer, info); + } + + protected abstract void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps); + + @Override + public void onSpsPps(ByteBuffer sps, ByteBuffer pps) { + if (streaming) onSpsPpsVpsRtp(sps, pps, null); + } + + @Override + public void onSpsPpsVps(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + if (streaming) onSpsPpsVpsRtp(sps, pps, vps); + } + + protected abstract void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info); + + @Override + public void getVideoData(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + fpsListener.calculateFps(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + recordController.recordVideo(h264Buffer, info); + } + if (streaming) getH264DataRtp(h264Buffer, info); + } + + @Override + public void inputPCMData(Frame frame) { + audioEncoder.inputPCMData(frame); + } + + @Override + public void inputYUVData(Frame frame) { + videoEncoder.inputYUVData(frame); + } + + @Override + public void onVideoFormat(MediaFormat mediaFormat) { + recordController.setVideoFormat(mediaFormat); + } + + @Override + public void onAudioFormat(MediaFormat mediaFormat) { + recordController.setAudioFormat(mediaFormat); + } +} \ No newline at end of file diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera2Base.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera2Base.java new file mode 100644 index 0000000..75b80b3 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/Camera2Base.java @@ -0,0 +1,816 @@ +package com.pedro.rtplibrary.base; + +import android.content.Context; +import android.hardware.camera2.CameraCharacteristics; +import android.media.MediaCodec; +import android.media.MediaFormat; +import android.os.Build; +import android.util.Size; +import android.view.MotionEvent; +import android.view.Surface; +import android.view.SurfaceView; +import android.view.TextureView; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.Frame; +import com.pedro.encoder.audio.AudioEncoder; +import com.pedro.encoder.audio.GetAacData; +import com.pedro.encoder.input.audio.CustomAudioEffect; +import com.pedro.encoder.input.audio.GetMicrophoneData; +import com.pedro.encoder.input.audio.MicrophoneManager; +import com.pedro.encoder.input.video.Camera2ApiManager; +import com.pedro.encoder.input.video.CameraHelper; +import com.pedro.encoder.input.video.CameraOpenException; +import com.pedro.encoder.utils.CodecUtil; +import com.pedro.encoder.video.FormatVideoEncoder; +import com.pedro.encoder.video.GetVideoData; +import com.pedro.encoder.video.VideoEncoder; +import com.pedro.rtplibrary.util.FpsListener; +import com.pedro.rtplibrary.util.RecordController; +import com.pedro.rtplibrary.view.GlInterface; +import com.pedro.rtplibrary.view.LightOpenGlView; +import com.pedro.rtplibrary.view.OffScreenGlThread; +import com.pedro.rtplibrary.view.OpenGlView; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.List; + +/** + * Wrapper to stream with camera2 api and microphone. Support stream with SurfaceView, TextureView, + * OpenGlView(Custom SurfaceView that use OpenGl) and Context(background mode). All views use + * Surface to buffer encoding mode for H264. + * + * API requirements: + * API 21+. + * + * Created by pedro on 7/07/17. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +public abstract class Camera2Base implements GetAacData, GetVideoData, GetMicrophoneData { + + protected Context context; + private Camera2ApiManager cameraManager; + protected VideoEncoder videoEncoder; + private MicrophoneManager microphoneManager; + private AudioEncoder audioEncoder; + private boolean streaming = false; + private SurfaceView surfaceView; + private TextureView textureView; + private GlInterface glInterface; + private boolean videoEnabled = false; + private boolean onPreview = false; + private boolean isBackground = false; + private RecordController recordController; + private int previewWidth, previewHeight; + private FpsListener fpsListener = new FpsListener(); + + public Camera2Base(SurfaceView surfaceView) { + this.surfaceView = surfaceView; + this.context = surfaceView.getContext(); + init(context); + } + + public Camera2Base(TextureView textureView) { + this.textureView = textureView; + this.context = textureView.getContext(); + init(context); + } + + public Camera2Base(OpenGlView openGlView) { + context = openGlView.getContext(); + glInterface = openGlView; + glInterface.init(); + init(context); + } + + public Camera2Base(LightOpenGlView lightOpenGlView) { + this.context = lightOpenGlView.getContext(); + glInterface = lightOpenGlView; + glInterface.init(); + init(context); + } + + public Camera2Base(Context context, boolean useOpengl) { + this.context = context; + if (useOpengl) { + glInterface = new OffScreenGlThread(context); + glInterface.init(); + } + isBackground = true; + init(context); + } + + private void init(Context context) { + cameraManager = new Camera2ApiManager(context); + videoEncoder = new VideoEncoder(this); + microphoneManager = new MicrophoneManager(this); + audioEncoder = new AudioEncoder(this); + recordController = new RecordController(); + } + + /** + * Set an audio effect modifying microphone's PCM buffer. + */ + public void setCustomAudioEffect(CustomAudioEffect customAudioEffect) { + microphoneManager.setCustomAudioEffect(customAudioEffect); + } + + /** + * @param callback get fps while record or stream + */ + public void setFpsListener(FpsListener.Callback callback) { + fpsListener.setCallback(callback); + } + + /** + * Experimental + */ + public void enableFaceDetection(Camera2ApiManager.FaceDetectorCallback faceDetectorCallback) { + cameraManager.enableFaceDetection(faceDetectorCallback); + } + + /** + * Experimental + */ + public void disableFaceDetection() { + cameraManager.disableFaceDetection(); + } + + /** + * Experimental + */ + public boolean isFaceDetectionEnabled() { + return cameraManager.isFaceDetectionEnabled(); + } + + public boolean isFrontCamera() { + return cameraManager.isFrontCamera(); + } + + public void enableLantern() throws Exception { + cameraManager.enableLantern(); + } + + public void disableLantern() { + cameraManager.disableLantern(); + } + + public boolean isLanternEnabled() { + return cameraManager.isLanternEnabled(); + } + + public boolean isLanternSupported() { + return cameraManager.isLanternSupported(); + } + + /** + * Basic auth developed to work with Wowza. No tested with other server + * + * @param user auth. + * @param password auth. + */ + public abstract void setAuthorization(String user, String password); + + /** + * Call this method before use @startStream. If not you will do a stream without video. + * + * @param width resolution in px. + * @param height resolution in px. + * @param fps frames per second of the stream. + * @param bitrate H264 in bps. + * @param hardwareRotation true if you want rotate using encoder, false if you with OpenGl if you + * are using OpenGlView. + * @param rotation could be 90, 180, 270 or 0 (Normally 0 if you are streaming in landscape or 90 + * if you are streaming in Portrait). This only affect to stream result. NOTE: Rotation with + * encoder is silence ignored in some devices. + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a H264 encoder). + */ + public boolean prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation, + int iFrameInterval, int rotation, int avcProfile, int avcProfileLevel) { + if (onPreview && !(glInterface != null && width == previewWidth && height == previewHeight)) { + stopPreview(); + onPreview = true; + } + boolean result = + videoEncoder.prepareVideoEncoder(width, height, fps, bitrate, rotation, hardwareRotation, + iFrameInterval, FormatVideoEncoder.SURFACE, avcProfile, avcProfileLevel); + prepareCameraManager(); + return result; + } + + public boolean prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation, + int iFrameInterval, int rotation) { + return prepareVideo(width, height, fps, bitrate, hardwareRotation, iFrameInterval, rotation, -1, + -1); + } + + /** + * backward compatibility reason + */ + public boolean prepareVideo(int width, int height, int fps, int bitrate, boolean hardwareRotation, + int rotation) { + return prepareVideo(width, height, fps, bitrate, hardwareRotation, 2, rotation); + } + + protected abstract void prepareAudioRtp(boolean isStereo, int sampleRate); + + /** + * Call this method before use @startStream. If not you will do a stream without audio. + * + * @param bitrate AAC in kb. + * @param sampleRate of audio in hz. Can be 8000, 16000, 22500, 32000, 44100. + * @param isStereo true if you want Stereo audio (2 audio channels), false if you want Mono audio + * (1 audio channel). + * @param echoCanceler true enable echo canceler, false disable. + * @param noiseSuppressor true enable noise suppressor, false disable. + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a AAC encoder). + */ + public boolean prepareAudio(int bitrate, int sampleRate, boolean isStereo, boolean echoCanceler, + boolean noiseSuppressor) { + microphoneManager.createMicrophone(sampleRate, isStereo, echoCanceler, noiseSuppressor); + prepareAudioRtp(isStereo, sampleRate); + return audioEncoder.prepareAudioEncoder(bitrate, sampleRate, isStereo, + microphoneManager.getMaxInputSize()); + } + + /** + * Same to call: isHardwareRotation = true; if (openGlVIew) isHardwareRotation = false; + * prepareVideo(640, 480, 30, 1200 * 1024, isHardwareRotation, 90); + * + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a H264 encoder). + */ + public boolean prepareVideo() { + boolean isHardwareRotation = glInterface == null; + int rotation = CameraHelper.getCameraOrientation(context); + return prepareVideo(640, 480, 30, 1200 * 1024, isHardwareRotation, rotation); + } + + /** + * Same to call: prepareAudio(64 * 1024, 32000, true, false, false); + * + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a AAC encoder). + */ + public boolean prepareAudio() { + return prepareAudio(64 * 1024, 32000, true, false, false); + } + + /** + * @param forceVideo force type codec used. FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE + * @param forceAudio force type codec used. FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE + */ + public void setForce(CodecUtil.Force forceVideo, CodecUtil.Force forceAudio) { + videoEncoder.setForce(forceVideo); + audioEncoder.setForce(forceAudio); + } + + /** + * Start record a MP4 video. Need be called while stream. + * + * @param path where file will be saved. + * @throws IOException If you init it before start stream. + */ + public void startRecord(String path, RecordController.Listener listener) throws IOException { + recordController.startRecord(path, listener); + if (!streaming) { + startEncoders(); + } else if (videoEncoder.isRunning()) { + resetVideoEncoder(); + } + } + + public void startRecord(final String path) throws IOException { + startRecord(path, null); + } + + /** + * Stop record MP4 video started with @startRecord. If you don't call it file will be unreadable. + */ + public void stopRecord() { + recordController.stopRecord(); + if (!streaming) stopStream(); + } + + public void replaceView(Context context) { + isBackground = true; + replaceGlInterface(new OffScreenGlThread(context)); + } + + public void replaceView(OpenGlView openGlView) { + isBackground = false; + replaceGlInterface(openGlView); + } + + public void replaceView(LightOpenGlView lightOpenGlView) { + isBackground = false; + replaceGlInterface(lightOpenGlView); + } + + /** + * Replace glInterface used on fly. Ignored if you use SurfaceView, TextureView or context without + * OpenGl. + */ + private void replaceGlInterface(GlInterface glInterface) { + if (this.glInterface != null && Build.VERSION.SDK_INT >= 18) { + if (isStreaming() || isRecording() || isOnPreview()) { + cameraManager.closeCamera(); + this.glInterface.removeMediaCodecSurface(); + this.glInterface.stop(); + this.glInterface = glInterface; + this.glInterface.init(); + boolean isPortrait = CameraHelper.isPortrait(context); + if (isPortrait) { + this.glInterface.setEncoderSize(videoEncoder.getHeight(), videoEncoder.getWidth()); + } else { + this.glInterface.setEncoderSize(videoEncoder.getWidth(), videoEncoder.getHeight()); + } + this.glInterface.setRotation( + videoEncoder.getRotation() == 0 ? 270 : videoEncoder.getRotation() - 90); + this.glInterface.start(); + if (isStreaming() || isRecording()) { + this.glInterface.addMediaCodecSurface(videoEncoder.getInputSurface()); + } + cameraManager.prepareCamera(this.glInterface.getSurfaceTexture(), videoEncoder.getWidth(), + videoEncoder.getHeight()); + cameraManager.openLastCamera(); + } else { + this.glInterface = glInterface; + this.glInterface.init(); + } + } + } + + /** + * Start camera preview. Ignored, if stream or preview is started. + * + * @param cameraFacing front or back camera. Like: {@link com.pedro.encoder.input.video.CameraHelper.Facing#BACK} + * {@link com.pedro.encoder.input.video.CameraHelper.Facing#FRONT} + * @param rotation camera rotation (0, 90, 180, 270). Recommended: {@link + * com.pedro.encoder.input.video.CameraHelper#getCameraOrientation(Context)} + */ + public void startPreview(CameraHelper.Facing cameraFacing, int width, int height, int rotation) { + if (!isStreaming() && !onPreview && !isBackground) { + previewWidth = width; + previewHeight = height; + if (surfaceView != null) { + cameraManager.prepareCamera(surfaceView.getHolder().getSurface()); + } else if (textureView != null) { + cameraManager.prepareCamera(new Surface(textureView.getSurfaceTexture())); + } else if (glInterface != null) { + boolean isPortrait = CameraHelper.isPortrait(context); + if (isPortrait) { + glInterface.setEncoderSize(height, width); + } else { + glInterface.setEncoderSize(width, height); + } + glInterface.setRotation(rotation == 0 ? 270 : rotation - 90); + glInterface.start(); + cameraManager.prepareCamera(glInterface.getSurfaceTexture(), width, height); + } + cameraManager.openCameraFacing(cameraFacing); + onPreview = true; + } + } + + public void startPreview(CameraHelper.Facing cameraFacing, int width, int height) { + startPreview(cameraFacing, width, height, CameraHelper.getCameraOrientation(context)); + } + + public void startPreview(CameraHelper.Facing cameraFacing, int rotation) { + startPreview(cameraFacing, videoEncoder.getWidth(), videoEncoder.getHeight(), rotation); + } + + public void startPreview(CameraHelper.Facing cameraFacing) { + startPreview(cameraFacing, videoEncoder.getWidth(), videoEncoder.getHeight(), + CameraHelper.getCameraOrientation(context)); + } + + public void startPreview() { + startPreview(CameraHelper.Facing.BACK); + } + + /** + * Stop camera preview. Ignored if streaming or already stopped. You need call it after + * + * @stopStream to release camera properly if you will close activity. + */ + public void stopPreview() { + if (!isStreaming() && !isRecording() && onPreview && !isBackground) { + if (glInterface != null) { + glInterface.stop(); + } + cameraManager.closeCamera(); + onPreview = false; + previewWidth = 0; + previewHeight = 0; + } + } + + protected abstract void startStreamRtp(String url); + + /** + * Need be called after @prepareVideo or/and @prepareAudio. This method override resolution of + * + * @param url of the stream like: protocol://ip:port/application/streamName + * + * RTSP: rtsp://192.168.1.1:1935/live/pedroSG94 RTSPS: rtsps://192.168.1.1:1935/live/pedroSG94 + * RTMP: rtmp://192.168.1.1:1935/live/pedroSG94 RTMPS: rtmps://192.168.1.1:1935/live/pedroSG94 + * @startPreview to resolution seated in @prepareVideo. If you never startPreview this method + * startPreview for you to resolution seated in @prepareVideo. + */ + public void startStream(String url) { + streaming = true; + if (!recordController.isRunning()) { + startEncoders(); + } else { + resetVideoEncoder(); + } + startStreamRtp(url); + onPreview = true; + } + + private void startEncoders() { + videoEncoder.start(); + audioEncoder.start(); + prepareGlView(); + microphoneManager.start(); + if (glInterface == null && !cameraManager.isRunning() && videoEncoder.getWidth() != previewWidth + || videoEncoder.getHeight() != previewHeight) { + if (onPreview) { + cameraManager.openLastCamera(); + } else { + cameraManager.openCameraBack(); + } + } + onPreview = true; + } + + private void resetVideoEncoder() { + if (glInterface != null) { + glInterface.removeMediaCodecSurface(); + } + videoEncoder.reset(); + if (glInterface != null) { + glInterface.addMediaCodecSurface(videoEncoder.getInputSurface()); + } else { + cameraManager.closeCamera(); + cameraManager.prepareCamera(videoEncoder.getInputSurface()); + cameraManager.openLastCamera(); + } + } + + private void prepareGlView() { + if (glInterface != null && videoEnabled) { + if (glInterface instanceof OffScreenGlThread) { + glInterface = new OffScreenGlThread(context); + glInterface.init(); + } + glInterface.setFps(videoEncoder.getFps()); + if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) { + glInterface.setEncoderSize(videoEncoder.getHeight(), videoEncoder.getWidth()); + } else { + glInterface.setEncoderSize(videoEncoder.getWidth(), videoEncoder.getHeight()); + } + int rotation = videoEncoder.getRotation(); + glInterface.setRotation(rotation == 0 ? 270 : rotation - 90); + if (!cameraManager.isRunning() && videoEncoder.getWidth() != previewWidth + || videoEncoder.getHeight() != previewHeight) { + glInterface.start(); + } + if (videoEncoder.getInputSurface() != null) { + glInterface.addMediaCodecSurface(videoEncoder.getInputSurface()); + } + cameraManager.prepareCamera(glInterface.getSurfaceTexture(), videoEncoder.getWidth(), + videoEncoder.getHeight()); + } + } + + protected abstract void stopStreamRtp(); + + /** + * Stop stream started with @startStream. + */ + public void stopStream() { + if (streaming) { + streaming = false; + stopStreamRtp(); + } + if (!recordController.isRecording()) { + onPreview = !isBackground; + microphoneManager.stop(); + if (glInterface != null) { + glInterface.removeMediaCodecSurface(); + if (glInterface instanceof OffScreenGlThread) { + glInterface.stop(); + cameraManager.closeCamera(); + } + } else { + if (isBackground) { + cameraManager.closeCamera(); + } else { + cameraManager.stopRepeatingEncoder(); + } + } + videoEncoder.stop(); + audioEncoder.stop(); + recordController.resetFormats(); + } + } + + public boolean reTry(long delay, String reason) { + boolean result = shouldRetry(reason); + if (result) { + reTry(delay); + } + return result; + } + + /** + * Replace with reTry(long delay, String reason); + */ + @Deprecated + public void reTry(long delay) { + resetVideoEncoder(); + reConnect(delay); + } + + /** + * Replace with reTry(long delay, String reason); + */ + @Deprecated + public abstract boolean shouldRetry(String reason); + + public abstract void setReTries(int reTries); + + protected abstract void reConnect(long delay); + + //cache control + public abstract void resizeCache(int newSize) throws RuntimeException; + + public abstract int getCacheSize(); + + public abstract long getSentAudioFrames(); + + public abstract long getSentVideoFrames(); + + public abstract long getDroppedAudioFrames(); + + public abstract long getDroppedVideoFrames(); + + public abstract void resetSentAudioFrames(); + + public abstract void resetSentVideoFrames(); + + public abstract void resetDroppedAudioFrames(); + + public abstract void resetDroppedVideoFrames(); + + /** + * Get supported preview resolutions of back camera in px. + * + * @return list of preview resolutions supported by back camera + */ + public List getResolutionsBack() { + return Arrays.asList(cameraManager.getCameraResolutionsBack()); + } + + /** + * Get supported preview resolutions of front camera in px. + * + * @return list of preview resolutions supported by front camera + */ + public List getResolutionsFront() { + return Arrays.asList(cameraManager.getCameraResolutionsFront()); + } + + /** + * Get supported properties of the camera + * + * @return CameraCharacteristics object + */ + public CameraCharacteristics getCameraCharacteristics() { + return cameraManager.getCameraCharacteristics(); + } + + /** + * Mute microphone, can be called before, while and after stream. + */ + public void disableAudio() { + microphoneManager.mute(); + } + + /** + * Enable a muted microphone, can be called before, while and after stream. + */ + public void enableAudio() { + microphoneManager.unMute(); + } + + /** + * Get mute state of microphone. + * + * @return true if muted, false if enabled + */ + public boolean isAudioMuted() { + return microphoneManager.isMuted(); + } + + /** + * Get video camera state + * + * @return true if disabled, false if enabled + */ + public boolean isVideoEnabled() { + return videoEnabled; + } + + /** + * Return max zoom level + * + * @return max zoom level + */ + public float getMaxZoom() { + return cameraManager.getMaxZoom(); + } + + /** + * Return current zoom level + * + * @return current zoom level + */ + public float getZoom() { + return cameraManager.getZoom(); + } + + /** + * Set zoomIn or zoomOut to camera. + * Use this method if you use a zoom slider. + * + * @param level Expected to be >= 1 and <= max zoom level + * @see Camera2Base#getMaxZoom() + */ + public void setZoom(float level) { + cameraManager.setZoom(level); + } + + /** + * Set zoomIn or zoomOut to camera. + * + * @param event motion event. Expected to get event.getPointerCount() > 1 + */ + public void setZoom(MotionEvent event) { + cameraManager.setZoom(event); + } + + public int getBitrate() { + return videoEncoder.getBitRate(); + } + + public int getResolutionValue() { + return videoEncoder.getWidth() * videoEncoder.getHeight(); + } + + public int getStreamWidth() { + return videoEncoder.getWidth(); + } + + public int getStreamHeight() { + return videoEncoder.getHeight(); + } + + /** + * Switch camera used. Can be called on preview or while stream, ignored with preview off. + * + * @throws CameraOpenException If the other camera doesn't support same resolution. + */ + public void switchCamera() throws CameraOpenException { + if (isStreaming() || onPreview) { + cameraManager.switchCamera(); + } + } + + public GlInterface getGlInterface() { + if (glInterface != null) { + return glInterface; + } else { + throw new RuntimeException("You can't do it. You are not using Opengl"); + } + } + + private void prepareCameraManager() { + if (textureView != null) { + cameraManager.prepareCamera(textureView, videoEncoder.getInputSurface()); + } else if (surfaceView != null) { + cameraManager.prepareCamera(surfaceView, videoEncoder.getInputSurface()); + } else if (glInterface != null) { + } else { + cameraManager.prepareCamera(videoEncoder.getInputSurface()); + } + videoEnabled = true; + } + + /** + * Set video bitrate of H264 in bits per second while stream. + * + * @param bitrate H264 in bits per second. + */ + public void setVideoBitrateOnFly(int bitrate) { + videoEncoder.setVideoBitrateOnFly(bitrate); + } + + /** + * Set limit FPS while stream. This will be override when you call to prepareVideo method. This + * could produce a change in iFrameInterval. + * + * @param fps frames per second + */ + public void setLimitFPSOnFly(int fps) { + videoEncoder.setFps(fps); + } + + /** + * Get stream state. + * + * @return true if streaming, false if not streaming. + */ + public boolean isStreaming() { + return streaming; + } + + /** + * Get record state. + * + * @return true if recording, false if not recoding. + */ + public boolean isRecording() { + return recordController.isRunning(); + } + + public void pauseRecord() { + recordController.pauseRecord(); + } + + public void resumeRecord() { + recordController.resumeRecord(); + } + + public RecordController.Status getRecordStatus() { + return recordController.getStatus(); + } + + /** + * Get preview state. + * + * @return true if enabled, false if disabled. + */ + public boolean isOnPreview() { + return onPreview; + } + + protected abstract void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info); + + @Override + public void getAacData(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + recordController.recordAudio(aacBuffer, info); + if (streaming) getAacDataRtp(aacBuffer, info); + } + + protected abstract void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps); + + @Override + public void onSpsPps(ByteBuffer sps, ByteBuffer pps) { + if (streaming) onSpsPpsVpsRtp(sps, pps, null); + } + + @Override + public void onSpsPpsVps(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + if (streaming) onSpsPpsVpsRtp(sps, pps, vps); + } + + protected abstract void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info); + + @Override + public void getVideoData(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + fpsListener.calculateFps(); + recordController.recordVideo(h264Buffer, info); + if (streaming) getH264DataRtp(h264Buffer, info); + } + + @Override + public void inputPCMData(Frame frame) { + audioEncoder.inputPCMData(frame); + } + + @Override + public void onVideoFormat(MediaFormat mediaFormat) { + recordController.setVideoFormat(mediaFormat); + } + + @Override + public void onAudioFormat(MediaFormat mediaFormat) { + recordController.setAudioFormat(mediaFormat); + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/DisplayBase.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/DisplayBase.java new file mode 100644 index 0000000..4d2a721 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/DisplayBase.java @@ -0,0 +1,537 @@ +package com.pedro.rtplibrary.base; + +import android.content.Context; +import android.content.Intent; +import android.hardware.display.VirtualDisplay; +import android.media.AudioAttributes; +import android.media.AudioPlaybackCaptureConfiguration; +import android.media.MediaCodec; +import android.media.MediaFormat; +import android.media.projection.MediaProjection; +import android.media.projection.MediaProjectionManager; +import android.os.Build; +import android.view.Surface; +import android.view.SurfaceView; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.Frame; +import com.pedro.encoder.audio.AudioEncoder; +import com.pedro.encoder.audio.GetAacData; +import com.pedro.encoder.input.audio.CustomAudioEffect; +import com.pedro.encoder.input.audio.GetMicrophoneData; +import com.pedro.encoder.input.audio.MicrophoneManager; +import com.pedro.encoder.utils.CodecUtil; +import com.pedro.encoder.video.FormatVideoEncoder; +import com.pedro.encoder.video.GetVideoData; +import com.pedro.encoder.video.VideoEncoder; +import com.pedro.rtplibrary.util.FpsListener; +import com.pedro.rtplibrary.util.RecordController; +import com.pedro.rtplibrary.view.GlInterface; +import com.pedro.rtplibrary.view.OffScreenGlThread; +import java.io.IOException; +import java.nio.ByteBuffer; + +import static android.content.Context.MEDIA_PROJECTION_SERVICE; + +/** + * Wrapper to stream display screen of your device and microphone. + * Can be executed in background. + * + * API requirements: + * API 21+. + * + * Created by pedro on 9/08/17. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +public abstract class DisplayBase implements GetAacData, GetVideoData, GetMicrophoneData { + + private OffScreenGlThread glInterface; + protected Context context; + private MediaProjection mediaProjection; + private MediaProjectionManager mediaProjectionManager; + protected VideoEncoder videoEncoder; + private MicrophoneManager microphoneManager; + private AudioEncoder audioEncoder; + private boolean streaming = false; + protected SurfaceView surfaceView; + private boolean videoEnabled = true; + private int dpi = 320; + private VirtualDisplay virtualDisplay; + private int resultCode = -1; + private Intent data; + private RecordController recordController; + private FpsListener fpsListener = new FpsListener(); + + public DisplayBase(Context context, boolean useOpengl) { + this.context = context; + if (useOpengl) { + glInterface = new OffScreenGlThread(context); + glInterface.init(); + } + mediaProjectionManager = + ((MediaProjectionManager) context.getSystemService(MEDIA_PROJECTION_SERVICE)); + this.surfaceView = null; + videoEncoder = new VideoEncoder(this); + microphoneManager = new MicrophoneManager(this); + audioEncoder = new AudioEncoder(this); + recordController = new RecordController(); + } + + /** + * Set an audio effect modifying microphone's PCM buffer. + */ + public void setCustomAudioEffect(CustomAudioEffect customAudioEffect) { + microphoneManager.setCustomAudioEffect(customAudioEffect); + } + + /** + * @param callback get fps while record or stream + */ + public void setFpsListener(FpsListener.Callback callback) { + fpsListener.setCallback(callback); + } + + /** + * Basic auth developed to work with Wowza. No tested with other server + * + * @param user auth. + * @param password auth. + */ + public abstract void setAuthorization(String user, String password); + + /** + * Call this method before use @startStream. If not you will do a stream without video. + * + * @param width resolution in px. + * @param height resolution in px. + * @param fps frames per second of the stream. + * @param bitrate H264 in bps. + * @param rotation could be 90, 180, 270 or 0 (Normally 0 if you are streaming in landscape or 90 + * if you are streaming in Portrait). This only affect to stream result. This work rotating with + * encoder. + * NOTE: Rotation with encoder is silence ignored in some devices. + * @param dpi of your screen device. + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a H264 encoder). + */ + public boolean prepareVideo(int width, int height, int fps, int bitrate, int rotation, int dpi, + int avcProfile, int avcProfileLevel, int iFrameInterval) { + this.dpi = dpi; + boolean result = + videoEncoder.prepareVideoEncoder(width, height, fps, bitrate, rotation, true, iFrameInterval, + FormatVideoEncoder.SURFACE, avcProfile, avcProfileLevel); + if (glInterface != null) { + glInterface = new OffScreenGlThread(context); + glInterface.init(); + glInterface.setEncoderSize(videoEncoder.getWidth(), videoEncoder.getHeight()); + } + return result; + } + + public boolean prepareVideo(int width, int height, int fps, int bitrate, int rotation, int dpi) { + return prepareVideo(width, height, fps, bitrate, rotation, dpi, -1, -1, 2); + } + + protected abstract void prepareAudioRtp(boolean isStereo, int sampleRate); + + /** + * Call this method before use @startStream. If not you will do a stream without audio. + * + * @param bitrate AAC in kb. + * @param sampleRate of audio in hz. Can be 8000, 16000, 22500, 32000, 44100. + * @param isStereo true if you want Stereo audio (2 audio channels), false if you want Mono audio + * (1 audio channel). + * @param echoCanceler true enable echo canceler, false disable. + * @param noiseSuppressor true enable noise suppressor, false disable. + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a AAC encoder). + */ + public boolean prepareAudio(int bitrate, int sampleRate, boolean isStereo, boolean echoCanceler, + boolean noiseSuppressor) { + microphoneManager.createMicrophone(sampleRate, isStereo, echoCanceler, noiseSuppressor); + prepareAudioRtp(isStereo, sampleRate); + return audioEncoder.prepareAudioEncoder(bitrate, sampleRate, isStereo, + microphoneManager.getMaxInputSize()); + } + + /** + * Call this method before use @startStream for streaming internal audio only. + * + * @param bitrate AAC in kb. + * @param sampleRate of audio in hz. Can be 8000, 16000, 22500, 32000, 44100. + * @param isStereo true if you want Stereo audio (2 audio channels), false if you want Mono audio + * (1 audio channel). + * @see AudioPlaybackCaptureConfiguration.Builder#Builder(MediaProjection) + */ + @RequiresApi(api = Build.VERSION_CODES.Q) + public boolean prepareInternalAudio(int bitrate, int sampleRate, boolean isStereo) { + if (mediaProjection == null) { + mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data); + } + + AudioPlaybackCaptureConfiguration config = new AudioPlaybackCaptureConfiguration + .Builder(mediaProjection) + .addMatchingUsage(AudioAttributes.USAGE_MEDIA) + .addMatchingUsage(AudioAttributes.USAGE_GAME) + .addMatchingUsage(AudioAttributes.USAGE_UNKNOWN) + .build(); + microphoneManager.createInternalMicrophone(config, sampleRate, isStereo); + prepareAudioRtp(isStereo, sampleRate); + return audioEncoder.prepareAudioEncoder(bitrate, sampleRate, isStereo, + microphoneManager.getMaxInputSize()); + } + + /** + * Same to call: + * rotation = 0; + * if (Portrait) rotation = 90; + * prepareVideo(640, 480, 30, 1200 * 1024, true, 0); + * + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a H264 encoder). + */ + public boolean prepareVideo() { + return prepareVideo(640, 480, 30, 1200 * 1024, 0, 320); + } + + /** + * Same to call: + * prepareAudio(64 * 1024, 32000, true, false, false); + * + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a AAC encoder). + */ + public boolean prepareAudio() { + return prepareAudio(64 * 1024, 32000, true, false, false); + } + + /** + * @param forceVideo force type codec used. FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE + * @param forceAudio force type codec used. FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE + */ + public void setForce(CodecUtil.Force forceVideo, CodecUtil.Force forceAudio) { + videoEncoder.setForce(forceVideo); + audioEncoder.setForce(forceAudio); + } + + /** + * Start record a MP4 video. Need be called while stream. + * + * @param path where file will be saved. + * @throws IOException If you init it before start stream. + */ + public void startRecord(String path, RecordController.Listener listener) throws IOException { + recordController.startRecord(path, listener); + if (!streaming) { + startEncoders(resultCode, data); + } else if (videoEncoder.isRunning()) { + resetVideoEncoder(); + } + } + + public void startRecord(final String path) throws IOException { + startRecord(path, null); + } + + /** + * Stop record MP4 video started with @startRecord. If you don't call it file will be unreadable. + */ + public void stopRecord() { + recordController.stopRecord(); + if (!streaming) stopStream(); + } + + protected abstract void startStreamRtp(String url); + + /** + * Create Intent used to init screen capture with startActivityForResult. + * + * @return intent to startActivityForResult. + */ + public Intent sendIntent() { + return mediaProjectionManager.createScreenCaptureIntent(); + } + + public void setIntentResult(int resultCode, Intent data) { + this.resultCode = resultCode; + this.data = data; + } + + /** + * Need be called after @prepareVideo or/and @prepareAudio. + * + * @param url of the stream like: + * protocol://ip:port/application/streamName + * + * RTSP: rtsp://192.168.1.1:1935/live/pedroSG94 + * RTSPS: rtsps://192.168.1.1:1935/live/pedroSG94 + * RTMP: rtmp://192.168.1.1:1935/live/pedroSG94 + * RTMPS: rtmps://192.168.1.1:1935/live/pedroSG94 + */ + public void startStream(String url) { + streaming = true; + if (!recordController.isRunning()) { + startEncoders(resultCode, data); + } else { + resetVideoEncoder(); + } + startStreamRtp(url); + } + + private void startEncoders(int resultCode, Intent data) { + if (data == null) { + throw new RuntimeException("You need send intent data before startRecord or startStream"); + } + videoEncoder.start(); + audioEncoder.start(); + if (glInterface != null) { + glInterface.setFps(videoEncoder.getFps()); + glInterface.start(); + glInterface.addMediaCodecSurface(videoEncoder.getInputSurface()); + } + Surface surface = + (glInterface != null) ? glInterface.getSurface() : videoEncoder.getInputSurface(); + if (mediaProjection == null) { + mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data); + } + virtualDisplay = mediaProjection.createVirtualDisplay("Stream Display", videoEncoder.getWidth(), + videoEncoder.getHeight(), dpi, 0, surface, null, null); + microphoneManager.start(); + } + + private void resetVideoEncoder() { + virtualDisplay.setSurface(null); + if (glInterface != null) { + glInterface.removeMediaCodecSurface(); + } + videoEncoder.reset(); + if (glInterface != null) { + glInterface.addMediaCodecSurface(videoEncoder.getInputSurface()); + } + virtualDisplay.setSurface( + glInterface != null ? glInterface.getSurface() : videoEncoder.getInputSurface()); + } + + protected abstract void stopStreamRtp(); + + /** + * Stop stream started with @startStream. + */ + public void stopStream() { + if (streaming) { + streaming = false; + stopStreamRtp(); + } + if (!recordController.isRecording()) { + microphoneManager.stop(); + if (mediaProjection != null) { + mediaProjection.stop(); + } + if (glInterface != null) { + glInterface.removeMediaCodecSurface(); + glInterface.stop(); + } + videoEncoder.stop(); + audioEncoder.stop(); + data = null; + recordController.resetFormats(); + } + } + + public boolean reTry(long delay, String reason) { + boolean result = shouldRetry(reason); + if (result) { + reTry(delay); + } + return result; + } + + /** + * Replace with reTry(long delay, String reason); + */ + @Deprecated + public void reTry(long delay) { + resetVideoEncoder(); + reConnect(delay); + } + + /** + * Replace with reTry(long delay, String reason); + */ + @Deprecated + public abstract boolean shouldRetry(String reason); + + public abstract void setReTries(int reTries); + + protected abstract void reConnect(long delay); + + //cache control + public abstract void resizeCache(int newSize) throws RuntimeException; + + public abstract int getCacheSize(); + + public abstract long getSentAudioFrames(); + + public abstract long getSentVideoFrames(); + + public abstract long getDroppedAudioFrames(); + + public abstract long getDroppedVideoFrames(); + + public abstract void resetSentAudioFrames(); + + public abstract void resetSentVideoFrames(); + + public abstract void resetDroppedAudioFrames(); + + public abstract void resetDroppedVideoFrames(); + + public GlInterface getGlInterface() { + if (glInterface != null) { + return glInterface; + } else { + throw new RuntimeException("You can't do it. You are not using Opengl"); + } + } + + /** + * Mute microphone, can be called before, while and after stream. + */ + public void disableAudio() { + microphoneManager.mute(); + } + + /** + * Enable a muted microphone, can be called before, while and after stream. + */ + public void enableAudio() { + microphoneManager.unMute(); + } + + /** + * Get mute state of microphone. + * + * @return true if muted, false if enabled + */ + public boolean isAudioMuted() { + return microphoneManager.isMuted(); + } + + /** + * Get video camera state + * + * @return true if disabled, false if enabled + */ + public boolean isVideoEnabled() { + return videoEnabled; + } + + public int getBitrate() { + return videoEncoder.getBitRate(); + } + + public int getResolutionValue() { + return videoEncoder.getWidth() * videoEncoder.getHeight(); + } + + public int getStreamWidth() { + return videoEncoder.getWidth(); + } + + public int getStreamHeight() { + return videoEncoder.getHeight(); + } + + /** + * Set video bitrate of H264 in bits per second while stream. + * + * @param bitrate H264 in bits per second. + */ + public void setVideoBitrateOnFly(int bitrate) { + videoEncoder.setVideoBitrateOnFly(bitrate); + } + + /** + * Set limit FPS while stream. This will be override when you call to prepareVideo method. + * This could produce a change in iFrameInterval. + * + * @param fps frames per second + */ + public void setLimitFPSOnFly(int fps) { + videoEncoder.setFps(fps); + } + + /** + * Get stream state. + * + * @return true if streaming, false if not streaming. + */ + public boolean isStreaming() { + return streaming; + } + + /** + * Get record state. + * + * @return true if recording, false if not recoding. + */ + public boolean isRecording() { + return recordController.isRunning(); + } + + public void pauseRecord() { + recordController.pauseRecord(); + } + + public void resumeRecord() { + recordController.resumeRecord(); + } + + public RecordController.Status getRecordStatus() { + return recordController.getStatus(); + } + + protected abstract void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info); + + @Override + public void getAacData(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + recordController.recordAudio(aacBuffer, info); + if (streaming) getAacDataRtp(aacBuffer, info); + } + + protected abstract void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps); + + @Override + public void onSpsPps(ByteBuffer sps, ByteBuffer pps) { + if (streaming) onSpsPpsVpsRtp(sps, pps, null); + } + + @Override + public void onSpsPpsVps(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + if (streaming) onSpsPpsVpsRtp(sps, pps, vps); + } + + protected abstract void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info); + + @Override + public void getVideoData(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + fpsListener.calculateFps(); + recordController.recordVideo(h264Buffer, info); + if (streaming) getH264DataRtp(h264Buffer, info); + } + + @Override + public void inputPCMData(Frame frame) { + audioEncoder.inputPCMData(frame); + } + + @Override + public void onVideoFormat(MediaFormat mediaFormat) { + recordController.setVideoFormat(mediaFormat); + } + + @Override + public void onAudioFormat(MediaFormat mediaFormat) { + recordController.setAudioFormat(mediaFormat); + } +} + diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/FromFileBase.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/FromFileBase.java new file mode 100644 index 0000000..204c699 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/FromFileBase.java @@ -0,0 +1,590 @@ +package com.pedro.rtplibrary.base; + +import android.content.Context; +import android.media.AudioFormat; +import android.media.AudioManager; +import android.media.AudioTrack; +import android.media.MediaCodec; +import android.media.MediaFormat; +import android.os.Build; +import android.util.Log; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.Frame; +import com.pedro.encoder.audio.AudioEncoder; +import com.pedro.encoder.audio.GetAacData; +import com.pedro.encoder.input.audio.GetMicrophoneData; +import com.pedro.encoder.input.decoder.AudioDecoder; +import com.pedro.encoder.input.decoder.AudioDecoderInterface; +import com.pedro.encoder.input.decoder.LoopFileInterface; +import com.pedro.encoder.input.decoder.VideoDecoder; +import com.pedro.encoder.input.decoder.VideoDecoderInterface; +import com.pedro.encoder.utils.CodecUtil; +import com.pedro.encoder.video.FormatVideoEncoder; +import com.pedro.encoder.video.GetVideoData; +import com.pedro.encoder.video.VideoEncoder; +import com.pedro.rtplibrary.util.FpsListener; +import com.pedro.rtplibrary.util.RecordController; +import com.pedro.rtplibrary.view.GlInterface; +import com.pedro.rtplibrary.view.LightOpenGlView; +import com.pedro.rtplibrary.view.OffScreenGlThread; +import com.pedro.rtplibrary.view.OpenGlView; +import java.io.IOException; +import java.nio.ByteBuffer; + +/** + * Wrapper to stream a MP4 file with H264 video codec. Only Video is streamed, no Audio. + * Can be executed in background. + * + * API requirements: + * API 18+. + * + * Created by pedro on 7/07/17. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public abstract class FromFileBase + implements GetVideoData, GetAacData, GetMicrophoneData, LoopFileInterface { + + private static final String TAG = "FromFileBase"; + private Context context; + + protected VideoEncoder videoEncoder; + private AudioEncoder audioEncoder; + private GlInterface glInterface; + private boolean streaming = false; + private boolean videoEnabled = true; + private RecordController recordController; + private FpsListener fpsListener = new FpsListener(); + + private VideoDecoder videoDecoder; + private AudioDecoder audioDecoder; + + private VideoDecoderInterface videoDecoderInterface; + private AudioDecoderInterface audioDecoderInterface; + + private String videoPath, audioPath; + private final Object sync = new Object(); + private AudioTrack audioTrackPlayer; + + public FromFileBase(VideoDecoderInterface videoDecoderInterface, + AudioDecoderInterface audioDecoderInterface) { + init(videoDecoderInterface, audioDecoderInterface); + } + + /** + * OpenGl mode, necessary context. + */ + public FromFileBase(Context context, VideoDecoderInterface videoDecoderInterface, + AudioDecoderInterface audioDecoderInterface) { + this.context = context; + glInterface = new OffScreenGlThread(context); + glInterface.init(); + init(videoDecoderInterface, audioDecoderInterface); + } + + public FromFileBase(OpenGlView openGlView, VideoDecoderInterface videoDecoderInterface, + AudioDecoderInterface audioDecoderInterface) { + context = openGlView.getContext(); + glInterface = openGlView; + glInterface.init(); + init(videoDecoderInterface, audioDecoderInterface); + } + + public FromFileBase(LightOpenGlView lightOpenGlView, VideoDecoderInterface videoDecoderInterface, + AudioDecoderInterface audioDecoderInterface) { + context = lightOpenGlView.getContext(); + glInterface = lightOpenGlView; + glInterface.init(); + init(videoDecoderInterface, audioDecoderInterface); + } + + private void init(VideoDecoderInterface videoDecoderInterface, + AudioDecoderInterface audioDecoderInterface) { + this.videoDecoderInterface = videoDecoderInterface; + this.audioDecoderInterface = audioDecoderInterface; + videoEncoder = new VideoEncoder(this); + audioEncoder = new AudioEncoder(this); + recordController = new RecordController(); + } + + /** + * @param callback get fps while record or stream + */ + public void setFpsListener(FpsListener.Callback callback) { + fpsListener.setCallback(callback); + } + + /** + * Basic auth developed to work with Wowza. No tested with other server + * + * @param user auth. + * @param password auth. + */ + public abstract void setAuthorization(String user, String password); + + /** + * @param filePath to video MP4 file. + * @param bitRate H264 in bps. + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a H264 encoder). + * @throws IOException Normally file not found. + */ + public boolean prepareVideo(String filePath, int bitRate, int rotation, int avcProfile, + int avcProfileLevel) throws IOException { + videoPath = filePath; + videoDecoder = new VideoDecoder(videoDecoderInterface, this); + if (!videoDecoder.initExtractor(filePath)) return false; + boolean hardwareRotation = glInterface == null; + return videoEncoder.prepareVideoEncoder(videoDecoder.getWidth(), videoDecoder.getHeight(), 30, + bitRate, rotation, hardwareRotation, 2, FormatVideoEncoder.SURFACE, avcProfile, + avcProfileLevel); + } + + public boolean prepareVideo(String filePath, int bitRate, int rotation) throws IOException { + return prepareVideo(filePath, bitRate, rotation, -1, -1); + } + + public boolean prepareVideo(String filePath) throws IOException { + return prepareVideo(filePath, 1200 * 1024, 0); + } + + /** + * @param filePath to video MP4 file. + * @param bitRate AAC in kb. + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a H264 encoder). + * @throws IOException Normally file not found. + */ + public boolean prepareAudio(String filePath, int bitRate) throws IOException { + audioPath = filePath; + audioDecoder = new AudioDecoder(this, audioDecoderInterface, this); + if (!audioDecoder.initExtractor(filePath)) return false; + boolean result = audioEncoder.prepareAudioEncoder(bitRate, audioDecoder.getSampleRate(), + audioDecoder.isStereo(), 0); + prepareAudioRtp(audioDecoder.isStereo(), audioDecoder.getSampleRate()); + audioDecoder.prepareAudio(); + if (glInterface != null && !(glInterface instanceof OffScreenGlThread)) { + int channel = + audioDecoder.isStereo() ? AudioFormat.CHANNEL_OUT_STEREO : AudioFormat.CHANNEL_OUT_MONO; + int buffSize = AudioTrack.getMinBufferSize(audioDecoder.getSampleRate(), channel, + AudioFormat.ENCODING_PCM_16BIT); + audioTrackPlayer = + new AudioTrack(AudioManager.STREAM_MUSIC, audioDecoder.getSampleRate(), channel, + AudioFormat.ENCODING_PCM_16BIT, buffSize, AudioTrack.MODE_STREAM); + } + return result; + } + + public boolean prepareAudio(String filePath) throws IOException { + return prepareAudio(filePath, 64 * 1024); + } + + protected abstract void prepareAudioRtp(boolean isStereo, int sampleRate); + + /** + * @param forceVideo force type codec used. FIRST_COMPATIBLE_FOUND, SOFTWARE, HARDWARE + */ + public void setForce(CodecUtil.Force forceVideo, CodecUtil.Force forceAudio) { + videoEncoder.setForce(forceVideo); + audioEncoder.setForce(forceAudio); + } + + /** + * Start record a MP4 video. Need be called while stream. + * + * @param path where file will be saved. + * @throws IOException If you init it before start stream. + */ + public void startRecord(String path, RecordController.Listener listener) throws IOException { + recordController.startRecord(path, listener); + if (!streaming) { + startEncoders(); + } else if (videoEncoder.isRunning()) { + resetVideoEncoder(); + } + } + + public void startRecord(final String path) throws IOException { + startRecord(path, null); + } + + /** + * Stop record MP4 video started with @startRecord. If you don't call it file will be unreadable. + */ + public void stopRecord() { + recordController.stopRecord(); + if (!streaming) stopStream(); + } + + protected abstract void startStreamRtp(String url); + + /** + * Need be called after @prepareVideo. + * + * @param url of the stream like: + * protocol://ip:port/application/streamName + * + * RTSP: rtsp://192.168.1.1:1935/live/pedroSG94 + * RTSPS: rtsps://192.168.1.1:1935/live/pedroSG94 + * RTMP: rtmp://192.168.1.1:1935/live/pedroSG94 + * RTMPS: rtmps://192.168.1.1:1935/live/pedroSG94 + */ + public void startStream(String url) { + streaming = true; + if (!recordController.isRunning()) { + startEncoders(); + } else { + resetVideoEncoder(); + } + startStreamRtp(url); + } + + private void startEncoders() { + videoEncoder.start(); + if (audioTrackPlayer != null) audioTrackPlayer.play(); + audioEncoder.start(); + prepareGlView(); + videoDecoder.start(); + audioDecoder.start(); + } + + private void prepareGlView() { + if (glInterface != null) { + if (glInterface instanceof OffScreenGlThread) { + glInterface = new OffScreenGlThread(context); + glInterface.init(); + } + glInterface.setFps(videoEncoder.getFps()); + if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) { + glInterface.setEncoderSize(videoEncoder.getHeight(), videoEncoder.getWidth()); + } else { + glInterface.setEncoderSize(videoEncoder.getWidth(), videoEncoder.getHeight()); + } + glInterface.setRotation(0); + glInterface.start(); + if (videoEncoder.getInputSurface() != null) { + glInterface.addMediaCodecSurface(videoEncoder.getInputSurface()); + } + videoDecoder.prepareVideo(glInterface.getSurface()); + } else { + videoDecoder.prepareVideo(videoEncoder.getInputSurface()); + } + } + + private void resetVideoEncoder() { + try { + if (glInterface != null) { + glInterface.removeMediaCodecSurface(); + glInterface.stop(); + } + double time = videoDecoder.getTime(); + videoDecoder.stop(); + videoDecoder = new VideoDecoder(videoDecoderInterface, this); + if (!videoDecoder.initExtractor(videoPath)) { + throw new IOException("fail to reset video file"); + } + videoEncoder.reset(); + prepareGlView(); + videoDecoder.start(); + videoDecoder.moveTo(time); + } catch (IOException e) { + Log.e(TAG, "Error", e); + } + } + + protected abstract void stopStreamRtp(); + + public boolean reTry(long delay, String reason) { + boolean result = shouldRetry(reason); + if (result) { + reTry(delay); + } + return result; + } + + /** + * Replace with reTry(long delay, String reason); + */ + @Deprecated + public void reTry(long delay) { + resetVideoEncoder(); + reConnect(delay); + } + + /** + * Replace with reTry(long delay, String reason); + */ + @Deprecated + public abstract boolean shouldRetry(String reason); + + public abstract void setReTries(int reTries); + + protected abstract void reConnect(long delay); + + //cache control + public abstract void resizeCache(int newSize) throws RuntimeException; + + public abstract int getCacheSize(); + + public abstract long getSentAudioFrames(); + + public abstract long getSentVideoFrames(); + + public abstract long getDroppedAudioFrames(); + + public abstract long getDroppedVideoFrames(); + + public abstract void resetSentAudioFrames(); + + public abstract void resetSentVideoFrames(); + + public abstract void resetDroppedAudioFrames(); + + public abstract void resetDroppedVideoFrames(); + + /** + * Stop stream started with @startStream. + */ + public void stopStream() { + if (streaming) { + streaming = false; + stopStreamRtp(); + } + if (!recordController.isRecording()) { + if (glInterface != null) { + glInterface.removeMediaCodecSurface(); + glInterface.stop(); + } + if (videoDecoder != null) videoDecoder.stop(); + if (audioDecoder != null) audioDecoder.stop(); + if (audioTrackPlayer != null + && audioTrackPlayer.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) { + audioTrackPlayer.stop(); + } + audioTrackPlayer = null; + videoEncoder.stop(); + audioEncoder.stop(); + recordController.resetFormats(); + } + } + + /** + * If you want reproduce video in loop. + * This mode clear all effects or stream object when video is restarted. TODO: No clear it. + * + * @param loopMode true in loop, false stop stream when video finish. + */ + public void setLoopMode(boolean loopMode) { + videoDecoder.setLoopMode(loopMode); + audioDecoder.setLoopMode(loopMode); + } + + public void reSyncFile() { + if (isStreaming()) audioDecoder.moveTo(videoDecoder.getTime()); + } + + public GlInterface getGlInterface() { + if (glInterface != null) { + return glInterface; + } else { + throw new RuntimeException("You can't do it. You are not using Opengl"); + } + } + + public int getBitrate() { + return videoEncoder.getBitRate(); + } + + public int getResolutionValue() { + return videoEncoder.getWidth() * videoEncoder.getHeight(); + } + + public int getStreamWidth() { + return videoEncoder.getWidth(); + } + + public int getStreamHeight() { + return videoEncoder.getHeight(); + } + + /** + * Get video camera state + * + * @return true if disabled, false if enabled + */ + public boolean isVideoEnabled() { + return videoEnabled; + } + + /** + * Set video bitrate of H264 in bits per second while stream. + * + * @param bitrate H264 in bits per second. + */ + public void setVideoBitrateOnFly(int bitrate) { + if (Build.VERSION.SDK_INT >= 19) { + videoEncoder.setVideoBitrateOnFly(bitrate); + } + } + + /** + * Set limit FPS while stream. This will be override when you call to prepareVideo method. + * This could produce a change in iFrameInterval. + * + * @param fps frames per second + */ + public void setLimitFPSOnFly(int fps) { + videoEncoder.setFps(fps); + } + + /** + * Get stream state. + * + * @return true if streaming, false if not streaming. + */ + public boolean isStreaming() { + return streaming; + } + + /** + * Get record state. + * + * @return true if recording, false if not recoding. + */ + public boolean isRecording() { + return recordController.isRunning(); + } + + public void pauseRecord() { + recordController.pauseRecord(); + } + + public void resumeRecord() { + recordController.resumeRecord(); + } + + public RecordController.Status getRecordStatus() { + return recordController.getStatus(); + } + + /** + * @return return time in second. 0 if no streaming + */ + public double getVideoTime() { + return videoDecoder.getTime(); + } + + /** + * @return return time in seconds. 0 if no streaming + */ + public double getAudioTime() { + return videoDecoder.getTime(); + } + + /** + * @return return duration in seconds. 0 if no streaming + */ + public double getVideoDuration() { + return videoDecoder.getDuration(); + } + + /** + * @return return duration in seconds. 0 if no streaming + */ + public double getAudioDuration() { + return audioDecoder.getDuration(); + } + + /** + * Working but it is too slow. You need wait few seconds after call it to continue :( + * + * @param time second to move. + */ + public void moveTo(double time) { + videoDecoder.moveTo(time); + audioDecoder.moveTo(time); + } + + @Override + public void onReset(boolean isVideo) { + synchronized (sync) { + try { + if (isVideo) { + if (glInterface != null) { + glInterface.removeMediaCodecSurface(); + glInterface.stop(); + } + videoDecoder.stop(); + videoDecoder = new VideoDecoder(videoDecoderInterface, this); + if (!videoDecoder.initExtractor(videoPath)) { + throw new IOException("fail to reset video file"); + } + prepareGlView(); + videoDecoder.start(); + } else { + audioDecoder.stop(); + audioDecoder = new AudioDecoder(this, audioDecoderInterface, this); + if (!audioDecoder.initExtractor(audioPath)) { + throw new IOException("fail to reset audio file"); + } + audioDecoder.prepareAudio(); + audioDecoder.start(); + } + } catch (IOException e) { + Log.e(TAG, "Error", e); + if (isVideo) { + videoDecoderInterface.onVideoDecoderFinished(); + } else { + audioDecoderInterface.onAudioDecoderFinished(); + } + } + } + } + + protected abstract void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps); + + @Override + public void onSpsPps(ByteBuffer sps, ByteBuffer pps) { + if (streaming) onSpsPpsVpsRtp(sps, pps, null); + } + + @Override + public void onSpsPpsVps(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + if (streaming) onSpsPpsVpsRtp(sps, pps, vps); + } + + protected abstract void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info); + + @Override + public void getVideoData(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + fpsListener.calculateFps(); + recordController.recordVideo(h264Buffer, info); + if (streaming) getH264DataRtp(h264Buffer, info); + } + + @Override + public void onVideoFormat(MediaFormat mediaFormat) { + recordController.setVideoFormat(mediaFormat); + } + + protected abstract void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info); + + @Override + public void getAacData(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + recordController.recordAudio(aacBuffer, info); + if (streaming) getAacDataRtp(aacBuffer, info); + } + + @Override + public void onAudioFormat(MediaFormat mediaFormat) { + recordController.setAudioFormat(mediaFormat); + } + + @Override + public void inputPCMData(Frame frame) { + if (audioTrackPlayer != null) { + audioTrackPlayer.write(frame.getBuffer(), frame.getOffset(), frame.getSize()); + } + audioEncoder.inputPCMData(frame); + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/base/OnlyAudioBase.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/OnlyAudioBase.java new file mode 100644 index 0000000..86f6741 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/base/OnlyAudioBase.java @@ -0,0 +1,204 @@ +package com.pedro.rtplibrary.base; + +import android.media.MediaCodec; +import android.media.MediaFormat; +import com.pedro.encoder.Frame; +import com.pedro.encoder.audio.AudioEncoder; +import com.pedro.encoder.audio.GetAacData; +import com.pedro.encoder.input.audio.CustomAudioEffect; +import com.pedro.encoder.input.audio.GetMicrophoneData; +import com.pedro.encoder.input.audio.MicrophoneManager; +import java.nio.ByteBuffer; + +/** + * Wrapper to stream only audio. It is under tests. + * + * Created by pedro on 10/07/18. + */ +public abstract class OnlyAudioBase implements GetAacData, GetMicrophoneData { + + private MicrophoneManager microphoneManager; + private AudioEncoder audioEncoder; + private boolean streaming = false; + + public OnlyAudioBase() { + microphoneManager = new MicrophoneManager(this); + audioEncoder = new AudioEncoder(this); + } + + /** + * Set an audio effect modifying microphone's PCM buffer. + */ + public void setCustomAudioEffect(CustomAudioEffect customAudioEffect) { + microphoneManager.setCustomAudioEffect(customAudioEffect); + } + + /** + * Basic auth developed to work with Wowza. No tested with other server + * + * @param user auth. + * @param password auth. + */ + public abstract void setAuthorization(String user, String password); + + protected abstract void prepareAudioRtp(boolean isStereo, int sampleRate); + + /** + * Call this method before use @startStream. If not you will do a stream without audio. + * + * @param bitrate AAC in kb. + * @param sampleRate of audio in hz. Can be 8000, 16000, 22500, 32000, 44100. + * @param isStereo true if you want Stereo audio (2 audio channels), false if you want Mono audio + * (1 audio channel). + * @param echoCanceler true enable echo canceler, false disable. + * @param noiseSuppressor true enable noise suppressor, false disable. + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a AAC encoder). + */ + public boolean prepareAudio(int bitrate, int sampleRate, boolean isStereo, boolean echoCanceler, + boolean noiseSuppressor) { + microphoneManager.createMicrophone(sampleRate, isStereo, echoCanceler, noiseSuppressor); + prepareAudioRtp(isStereo, sampleRate); + return audioEncoder.prepareAudioEncoder(bitrate, sampleRate, isStereo, + microphoneManager.getMaxInputSize()); + } + + /** + * Same to call: + * prepareAudio(64 * 1024, 32000, true, false, false); + * + * @return true if success, false if you get a error (Normally because the encoder selected + * doesn't support any configuration seated or your device hasn't a AAC encoder). + */ + public boolean prepareAudio() { + return prepareAudio(64 * 1024, 32000, true, false, false); + } + + protected abstract void startStreamRtp(String url); + + /** + * Need be called after @prepareVideo or/and @prepareAudio. + * + * @param url of the stream like: + * protocol://ip:port/application/streamName + * + * RTSP: rtsp://192.168.1.1:1935/live/pedroSG94 + * RTSPS: rtsps://192.168.1.1:1935/live/pedroSG94 + * RTMP: rtmp://192.168.1.1:1935/live/pedroSG94 + * RTMPS: rtmps://192.168.1.1:1935/live/pedroSG94 + */ + public void startStream(String url) { + streaming = true; + audioEncoder.start(); + microphoneManager.start(); + startStreamRtp(url); + } + + protected abstract void stopStreamRtp(); + + public boolean reTry(long delay, String reason) { + boolean result = shouldRetry(reason); + if (result) { + reTry(delay); + } + return result; + } + + /** + * Replace with reTry(long delay, String reason); + */ + @Deprecated + public void reTry(long delay) { + reConnect(delay); + } + + /** + * Replace with reTry(long delay, String reason); + */ + @Deprecated + public abstract boolean shouldRetry(String reason); + + public abstract void setReTries(int reTries); + + protected abstract void reConnect(long delay); + + //cache control + public abstract void resizeCache(int newSize) throws RuntimeException; + + public abstract int getCacheSize(); + + public abstract long getSentAudioFrames(); + + public abstract long getSentVideoFrames(); + + public abstract long getDroppedAudioFrames(); + + public abstract long getDroppedVideoFrames(); + + public abstract void resetSentAudioFrames(); + + public abstract void resetSentVideoFrames(); + + public abstract void resetDroppedAudioFrames(); + + public abstract void resetDroppedVideoFrames(); + + /** + * Stop stream started with @startStream. + */ + public void stopStream() { + streaming = false; + stopStreamRtp(); + microphoneManager.stop(); + audioEncoder.stop(); + } + + /** + * Mute microphone, can be called before, while and after stream. + */ + public void disableAudio() { + microphoneManager.mute(); + } + + /** + * Enable a muted microphone, can be called before, while and after stream. + */ + public void enableAudio() { + microphoneManager.unMute(); + } + + /** + * Get mute state of microphone. + * + * @return true if muted, false if enabled + */ + public boolean isAudioMuted() { + return microphoneManager.isMuted(); + } + + /** + * Get stream state. + * + * @return true if streaming, false if not streaming. + */ + public boolean isStreaming() { + return streaming; + } + + protected abstract void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info); + + @Override + public void getAacData(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + getAacDataRtp(aacBuffer, info); + } + + @Override + public void inputPCMData(Frame frame) { + audioEncoder.inputPCMData(frame); + } + + @Override + public void onAudioFormat(MediaFormat mediaFormat) { + //ignored because record is not implemented + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/AdapterBitrateParser.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/AdapterBitrateParser.java new file mode 100644 index 0000000..3cc829d --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/AdapterBitrateParser.java @@ -0,0 +1,40 @@ +package com.pedro.rtplibrary.network; + +@Deprecated +public class AdapterBitrateParser { + + public static long DELAY = 1000; + public static long DIFFERENCE = 500; + private static long cont = 0; + public static int maxVideoBitrate = 0; + + public interface Callback { + void onNewBitrate(int bitrate); + } + + public static void parseBitrate(int oldBitrate, int bandwidth, Callback callback) { + if (cont == 0) cont = System.currentTimeMillis(); + if (System.currentTimeMillis() - cont > DELAY) { + cont = 0; + if (oldBitrate / 1000 - bandwidth >= DIFFERENCE + || maxVideoBitrate != 0 && oldBitrate / 1000 >= maxVideoBitrate) { + callback.onNewBitrate((int) (oldBitrate - (DIFFERENCE * 1000))); + } else if (oldBitrate / 1000 - bandwidth <= DIFFERENCE) { + callback.onNewBitrate((int) (oldBitrate + (DIFFERENCE * 1000))); + } + } + } + + public static void calculateMaxVideoBitrate(int resolutionValue) { + maxVideoBitrate = (int) (1.65287774651705E-10 * Math.pow(resolutionValue, 2) + + 0.002653652033201 * resolutionValue + + 640.220156152395); + } + + public static void reset() { + DELAY = 1000; + DIFFERENCE = 500; + cont = 0; + maxVideoBitrate = 0; + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ByteArrayScanner.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ByteArrayScanner.java new file mode 100644 index 0000000..6f30a67 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ByteArrayScanner.java @@ -0,0 +1,149 @@ +package com.pedro.rtplibrary.network; + +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +import java.util.NoSuchElementException; + +@Deprecated +class ByteArrayScanner { + private byte[] mData; + private int mCurrentOffset; + private int mTotalLength; + private char mDelimiter; + private boolean mDelimiterSet; + + public ByteArrayScanner reset(byte[] buffer, int length) { + mData = buffer; + mCurrentOffset = 0; + mTotalLength = length; + mDelimiterSet = false; + return this; + } + + public ByteArrayScanner useDelimiter(char delimiter) { + throwIfNotReset(); + mDelimiter = delimiter; + mDelimiterSet = true; + return this; + } + + private void throwIfNotReset() { + if (mData == null) { + throw new IllegalStateException("Must call reset first"); + } + } + + private void throwIfDelimiterNotSet() { + if (!mDelimiterSet) { + throw new IllegalStateException("Must call useDelimiter first"); + } + } + + /** + * @return The next token, parsed as a string. + * @throws NoSuchElementException + */ + public String nextString() throws NoSuchElementException { + throwIfNotReset(); + throwIfDelimiterNotSet(); + int offset = mCurrentOffset; + int length = advance(); + return new String(mData, offset, length); + } + + /** + * Matches the next token with a string. + * + * @param str String to match the next token with. + * @return True if the next token matches, false otherwise. + * @throws NoSuchElementException + */ + public boolean nextStringEquals(String str) throws NoSuchElementException { + int offset = mCurrentOffset; + int length = advance(); + if (str.length() != length) { + return false; + } + for (int i = 0; i < str.length(); i++) { + if (str.charAt(i) != mData[offset]) { + return false; + } + offset++; + } + return true; + } + + /** + * @return The next token, parsed as an integer. + * @throws NoSuchElementException + */ + public int nextInt() throws NoSuchElementException { + throwIfNotReset(); + throwIfDelimiterNotSet(); + int offset = mCurrentOffset; + int length = advance(); + int value = parseInt(mData, offset, offset + length); + return value; + } + + /** + * Move to the next token. + * + * @throws NoSuchElementException + */ + public void skip() throws NoSuchElementException { + throwIfNotReset(); + throwIfDelimiterNotSet(); + advance(); + } + + private int advance() throws NoSuchElementException { + throwIfNotReset(); + throwIfDelimiterNotSet(); + if (mTotalLength <= mCurrentOffset) { + throw new NoSuchElementException( + "Reading past end of input stream at " + mCurrentOffset + "."); + } + int index = indexOf(mData, mCurrentOffset, mTotalLength, mDelimiter); + if (index == -1) { + int length = mTotalLength - mCurrentOffset; + mCurrentOffset = mTotalLength; + return length; + } else { + int length = index - mCurrentOffset; + mCurrentOffset = index + 1; + return length; + } + } + + private static int parseInt(byte[] buffer, int start, int end) throws NumberFormatException { + int radix = 10; + int result = 0; + while (start < end) { + int digit = buffer[start++] - '0'; + if (digit < 0 || digit > 9) { + throw new NumberFormatException("Invalid int in buffer at " + (start - 1) + "."); + } + int next = result * radix + digit; + result = next; + } + return result; + } + + private static int indexOf(byte[] data, int start, int end, char ch) { + for (int i = start; i < end; i++) { + if (data[i] == ch) { + return i; + } + } + return -1; + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ConnectionClassManager.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ConnectionClassManager.java new file mode 100644 index 0000000..8cf8fc5 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/ConnectionClassManager.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +package com.pedro.rtplibrary.network; + +/** + *

+ * Class used to calculateViewPort the approximate bandwidth of a user's connection. + *

+ *

+ * This class notifies all subscribed {@link ConnectionClassStateChangeListener} with the new + * ConnectionClass when the network's ConnectionClass changes. + *

+ */ + +@Deprecated +public class ConnectionClassManager { + + private static final int BYTES_TO_BITS = 8; + + /** Current bandwidth of the user's connection depending upon the response. */ + private ConnectionClassStateChangeListener listener; + /** + * The lower bound for measured bandwidth in bits/ms. Readings + * lower than this are treated as effectively zero (therefore ignored). + */ + static final long BANDWIDTH_LOWER_BOUND = 10; + + // Singleton. + private static class ConnectionClassManagerHolder { + public static final ConnectionClassManager instance = new ConnectionClassManager(); + } + + /** + * Retrieval method for the DownloadBandwidthManager singleton. + * + * @return The singleton instance of DownloadBandwidthManager. + */ + public static ConnectionClassManager getInstance() { + return ConnectionClassManagerHolder.instance; + } + + // Force constructor to be private. + private ConnectionClassManager() { + } + + /** + * Adds bandwidth to the current filtered latency counter. Sends a broadcast to all + * {@link ConnectionClassStateChangeListener} if the counter moves from one bucket + * to another (i.e. poor bandwidth -> moderate bandwidth). + */ + public synchronized void addBandwidth(long bytes, long timeInMs) { + + //Ignore garbage values. + if (timeInMs == 0 || (bytes) * 1.0 / (timeInMs) * BYTES_TO_BITS < BANDWIDTH_LOWER_BOUND) { + return; + } + double bandwidth = (bytes) * 1.0 / (timeInMs) * BYTES_TO_BITS; + if (listener != null) listener.onBandwidthStateChange(bandwidth); + } + + /** + * Interface for listening to when ConnectionClassManager + * changes state. + */ + public interface ConnectionClassStateChangeListener { + /** + * The method that will be called when ConnectionClassManager + * changes ConnectionClass. + */ + void onBandwidthStateChange(double bandwidth); + } + + /** + * Method for adding new listeners to this class. + * + * @param listener {@link ConnectionClassStateChangeListener} to add as a listener. + */ + public void register(ConnectionClassStateChangeListener listener) { + this.listener = listener; + } + + /** + * Method for removing listeners from this class. + */ + public void remove() { + listener = null; + } +} \ No newline at end of file diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/LineBufferReader.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/LineBufferReader.java new file mode 100644 index 0000000..430c029 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/LineBufferReader.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +package com.pedro.rtplibrary.network; + +import java.io.FileInputStream; +import java.io.IOException; + +/** + * Class for reading {@code /proc/net/xt_qtaguid/stats} line by line with a small, + * reusable byte buffer. + */ + +@Deprecated +class LineBufferReader { + + private byte[] mFileBuffer; + private FileInputStream mInputStream; + private int mFileBufIndex; + private int mBytesInBuffer; + + public LineBufferReader() { + mFileBuffer = new byte[512]; + } + + /** + * Sets the FileInputStream for reading. + * + * @param is The FileInputStream to set. + */ + public void setFileStream(FileInputStream is) { + mInputStream = is; + mBytesInBuffer = 0; + mFileBufIndex = 0; + } + + /** + * @param lineBuffer The buffer to fill with the current line. + * @return The index in the buffer at which the line terminates. + */ + public int readLine(byte[] lineBuffer) throws IOException { + if (mFileBufIndex >= mBytesInBuffer) { + mBytesInBuffer = mInputStream.read(mFileBuffer); + mFileBufIndex = 0; + } + int i; + for (i = 0; mBytesInBuffer != -1 && i < lineBuffer.length && mFileBuffer[mFileBufIndex] != '\n'; + i++) { + lineBuffer[i] = mFileBuffer[mFileBufIndex]; + mFileBufIndex++; + if (mFileBufIndex >= mBytesInBuffer) { + mBytesInBuffer = mInputStream.read(mFileBuffer); + mFileBufIndex = 0; + } + } + // Move past the newline character. + mFileBufIndex++; + // If there are no more bytes to be read into the buffer, + // we have reached the end of this file. Exit. + if (mBytesInBuffer == -1) { + return -1; + } + return i; + } + + /** + * Skips a line in the current file stream. + */ + public void skipLine() throws IOException { + if (mFileBufIndex >= mBytesInBuffer) { + mBytesInBuffer = mInputStream.read(mFileBuffer); + mFileBufIndex = 0; + } + for (int i = 0; mBytesInBuffer != -1 && mFileBuffer[mFileBufIndex] != '\n'; i++) { + mFileBufIndex++; + if (mFileBufIndex >= mBytesInBuffer) { + mBytesInBuffer = mInputStream.read(mFileBuffer); + mFileBufIndex = 0; + } + } + // Move past the newline character. + mFileBufIndex++; + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/QTagTxParser.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/QTagTxParser.java new file mode 100644 index 0000000..7be5fb5 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/QTagTxParser.java @@ -0,0 +1,147 @@ +package com.pedro.rtplibrary.network; + +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +import android.os.StrictMode; +import android.util.Log; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.NoSuchElementException; + +/** + * Class for parsing total number of downloaded bytes + * from {@code /proc/net/xt_qtaguid/stats}. + */ + +@Deprecated +class QTagTxParser { + private static final String TAG = "QTagParser"; + private static final String QTAGUID_UID_STATS = "/proc/net/xt_qtaguid/stats"; + + private static final ThreadLocal sLineBuffer = new ThreadLocal() { + @Override + public byte[] initialValue() { + return new byte[512]; + } + }; + + private static long sPreviousBytes = -1; + private static LineBufferReader sStatsReader = new LineBufferReader(); + private static ByteArrayScanner sScanner = new ByteArrayScanner(); + public static QTagTxParser sInstance; + + public static synchronized QTagTxParser getInstance() { + if (sInstance == null) { + sInstance = new QTagTxParser(QTAGUID_UID_STATS); + } + return sInstance; + } + + private String mPath; + + // @VisibleForTesting + public QTagTxParser(String path) { + mPath = path; + } + + /** + * Reads the qtaguid file and returns a difference from the previous read. + * + * @param uid The target uid to read bytes downloaded for. + * @return The difference between the current number of bytes downloaded and + */ + public long parseDataUsageForUidAndTag(int uid) { + // The format of each line is + // idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes + // (There are many more fields but we are not interested in them) + // For us parts: 1, 2, 3 are to see if the line is relevant + // and part 5 is the received bytes + // (part numbers start from 0) + + // Permit disk reads here, as /proc/net/xt_qtaguid/stats isn't really "on + // disk" and should be fast. + StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); + try { + long tagTxBytes = 0; + + FileInputStream fis = new FileInputStream(mPath); + sStatsReader.setFileStream(fis); + byte[] buffer = sLineBuffer.get(); + + try { + int length; + sStatsReader.skipLine(); // skip first line (headers) + + int line = 2; + while ((length = sStatsReader.readLine(buffer)) != -1) { + try { + + // Content is arranged in terms of: + // idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes + // rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets + // tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets + + // The ones we're interested in are: + // idx - ignore + // interface, filter out local interface ("lo") + // tag - ignore + // uid_tag_int, match it with the UID of interest + // cnt_set - ignore + // rx_bytes + + sScanner.reset(buffer, length); + sScanner.useDelimiter(' '); + + sScanner.skip(); + if (sScanner.nextStringEquals("lo")) { + continue; + } + sScanner.skip(); + if (sScanner.nextInt() != uid) { + continue; + } + sScanner.skip(); + sScanner.skip(); + sScanner.skip(); + int txBytes = sScanner.nextInt(); + tagTxBytes += txBytes; + line++; + // If the line is incorrectly formatted, ignore the line. + } catch (NumberFormatException e) { + Log.e(TAG, "Cannot parse byte count at line" + line + "."); + continue; + } catch (NoSuchElementException e) { + Log.e(TAG, "Invalid number of tokens on line " + line + "."); + continue; + } + } + } finally { + fis.close(); + } + + if (sPreviousBytes == -1) { + sPreviousBytes = tagTxBytes; + return -1; + } + long diff = tagTxBytes - sPreviousBytes; + sPreviousBytes = tagTxBytes; + return diff; + } catch (IOException e) { + Log.e(TAG, + "Error reading from /proc/net/xt_qtaguid/stats. Please check if this file exists."); + } finally { + StrictMode.setThreadPolicy(savedPolicy); + } + + // Return -1 upon error. + return -1; + } +} \ No newline at end of file diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/network/UploadBandwidthSampler.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/UploadBandwidthSampler.java new file mode 100644 index 0000000..c3cb6ad --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/network/UploadBandwidthSampler.java @@ -0,0 +1,135 @@ +package com.pedro.rtplibrary.network; + +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.os.Process; +import android.os.SystemClock; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Class used to read from the file {@code /proc/net/xt_qtaguid/stats} periodically, in order to + * determine a ConnectionClass. + */ + +@Deprecated +public class UploadBandwidthSampler { + + /** + * Time between polls in ms. + */ + static final long SAMPLE_TIME = 1000; + + /** + * The DownloadBandwidthManager that keeps track of the moving average and ConnectionClass. + */ + private final ConnectionClassManager mConnectionClassManager; + + private AtomicInteger mSamplingCounter; + + private Handler mHandler; + private HandlerThread mThread; + + private long mLastTimeReading; + + // Singleton. + private static class UploadBandwidthSamplerHolder { + public static final UploadBandwidthSampler instance = + new UploadBandwidthSampler(ConnectionClassManager.getInstance()); + } + + /** + * Retrieval method for the DeviceBandwidthSampler singleton. + * + * @return The singleton instance of DeviceBandwidthSampler. + */ + public static UploadBandwidthSampler getInstance() { + return UploadBandwidthSamplerHolder.instance; + } + + private UploadBandwidthSampler(ConnectionClassManager connectionClassManager) { + mConnectionClassManager = connectionClassManager; + mSamplingCounter = new AtomicInteger(); + mThread = new HandlerThread("ParseThread"); + mThread.start(); + mHandler = new SamplingHandler(mThread.getLooper()); + } + + /** + * Method call to start sampling for download bandwidth. + */ + public void startSampling() { + if (mSamplingCounter.getAndIncrement() == 0) { + mHandler.sendEmptyMessage(SamplingHandler.MSG_START); + mLastTimeReading = SystemClock.elapsedRealtime(); + } + } + + /** + * Finish sampling and prevent further changes to the + * ConnectionClass until another timer is started. + */ + public void stopSampling() { + if (mSamplingCounter.decrementAndGet() == 0) { + mHandler.sendEmptyMessage(SamplingHandler.MSG_STOP); + } + } + + private class SamplingHandler extends Handler { + static final int MSG_START = 1; + static final int MSG_STOP = 2; + + public SamplingHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_START: + addSample(); + sendEmptyMessageDelayed(MSG_START, SAMPLE_TIME); + break; + case MSG_STOP: + addSample(); + removeMessages(MSG_START); + break; + default: + throw new IllegalArgumentException("Unknown what=" + msg.what); + } + } + + /** + * Method for polling for the change in total bytes since last update and + * adding it to the BandwidthManager. + */ + private void addSample() { + long byteDiff = QTagTxParser.getInstance().parseDataUsageForUidAndTag(Process.myUid()); + synchronized (this) { + long curTimeReading = SystemClock.elapsedRealtime(); + if (byteDiff != -1) { + mConnectionClassManager.addBandwidth(byteDiff, curTimeReading - mLastTimeReading); + } + mLastTimeReading = curTimeReading; + } + } + } + + /** + * @return True if there are still threads which are sampling, false otherwise. + */ + public boolean isSampling() { + return (mSamplingCounter.get() != 0); + } +} \ No newline at end of file diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpCamera1.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpCamera1.java new file mode 100644 index 0000000..9bde06a --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpCamera1.java @@ -0,0 +1,169 @@ +package com.pedro.rtplibrary.rtmp; + +import android.content.Context; +import android.media.MediaCodec; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.view.SurfaceView; +import android.view.TextureView; +import com.pedro.rtplibrary.base.Camera1Base; +import com.pedro.rtplibrary.view.LightOpenGlView; +import com.pedro.rtplibrary.view.OpenGlView; +import java.nio.ByteBuffer; +import net.ossrs.rtmp.ConnectCheckerRtmp; +import net.ossrs.rtmp.SrsFlvMuxer; + +/** + * More documentation see: + * {@link com.pedro.rtplibrary.base.Camera1Base} + * + * Created by pedro on 25/01/17. + */ + +public class RtmpCamera1 extends Camera1Base { + + private SrsFlvMuxer srsFlvMuxer; + + public RtmpCamera1(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) { + super(surfaceView); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + public RtmpCamera1(TextureView textureView, ConnectCheckerRtmp connectChecker) { + super(textureView); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public RtmpCamera1(OpenGlView openGlView, ConnectCheckerRtmp connectChecker) { + super(openGlView); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public RtmpCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker) { + super(lightOpenGlView); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public RtmpCamera1(Context context, ConnectCheckerRtmp connectChecker) { + super(context); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + /** + * H264 profile. + * + * @param profileIop Could be ProfileIop.BASELINE or ProfileIop.CONSTRAINED + */ + public void setProfileIop(byte profileIop) { + srsFlvMuxer.setProfileIop(profileIop); + } + + @Override + public void resizeCache(int newSize) throws RuntimeException { + srsFlvMuxer.resizeFlvTagCache(newSize); + } + + @Override + public int getCacheSize() { + return srsFlvMuxer.getFlvTagCacheSize(); + } + + @Override + public long getSentAudioFrames() { + return srsFlvMuxer.getSentAudioFrames(); + } + + @Override + public long getSentVideoFrames() { + return srsFlvMuxer.getSentVideoFrames(); + } + + @Override + public long getDroppedAudioFrames() { + return srsFlvMuxer.getDroppedAudioFrames(); + } + + @Override + public long getDroppedVideoFrames() { + return srsFlvMuxer.getDroppedVideoFrames(); + } + + @Override + public void resetSentAudioFrames() { + srsFlvMuxer.resetSentAudioFrames(); + } + + @Override + public void resetSentVideoFrames() { + srsFlvMuxer.resetSentVideoFrames(); + } + + @Override + public void resetDroppedAudioFrames() { + srsFlvMuxer.resetDroppedAudioFrames(); + } + + @Override + public void resetDroppedVideoFrames() { + srsFlvMuxer.resetDroppedVideoFrames(); + } + + @Override + public void setAuthorization(String user, String password) { + srsFlvMuxer.setAuthorization(user, password); + } + + @Override + protected void prepareAudioRtp(boolean isStereo, int sampleRate) { + srsFlvMuxer.setIsStereo(isStereo); + srsFlvMuxer.setSampleRate(sampleRate); + } + + @Override + protected void startStreamRtp(String url) { + if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) { + srsFlvMuxer.setVideoResolution(videoEncoder.getHeight(), videoEncoder.getWidth()); + } else { + srsFlvMuxer.setVideoResolution(videoEncoder.getWidth(), videoEncoder.getHeight()); + } + srsFlvMuxer.start(url); + } + + @Override + protected void stopStreamRtp() { + srsFlvMuxer.stop(); + } + + @Override + public void setReTries(int reTries) { + srsFlvMuxer.setReTries(reTries); + } + + @Override + public boolean shouldRetry(String reason) { + return srsFlvMuxer.shouldRetry(reason); + } + + @Override + public void reConnect(long delay) { + srsFlvMuxer.reConnect(delay); + } + + @Override + protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + srsFlvMuxer.sendAudio(aacBuffer, info); + } + + @Override + protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + srsFlvMuxer.setSpsPPs(sps, pps); + } + + @Override + protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + srsFlvMuxer.sendVideo(h264Buffer, info); + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpCamera2.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpCamera2.java new file mode 100644 index 0000000..6418fbe --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpCamera2.java @@ -0,0 +1,170 @@ +package com.pedro.rtplibrary.rtmp; + +import android.content.Context; +import android.media.MediaCodec; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.view.SurfaceView; +import android.view.TextureView; + +import com.pedro.rtplibrary.base.Camera2Base; + +import com.pedro.rtplibrary.view.LightOpenGlView; +import com.pedro.rtplibrary.view.OpenGlView; +import net.ossrs.rtmp.ConnectCheckerRtmp; +import net.ossrs.rtmp.SrsFlvMuxer; + +import java.nio.ByteBuffer; + +/** + * More documentation see: + * {@link com.pedro.rtplibrary.base.Camera2Base} + * + * Created by pedro on 6/07/17. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +public class RtmpCamera2 extends Camera2Base { + + private SrsFlvMuxer srsFlvMuxer; + + public RtmpCamera2(SurfaceView surfaceView, ConnectCheckerRtmp connectChecker) { + super(surfaceView); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + public RtmpCamera2(TextureView textureView, ConnectCheckerRtmp connectChecker) { + super(textureView); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + public RtmpCamera2(OpenGlView openGlView, ConnectCheckerRtmp connectChecker) { + super(openGlView); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + public RtmpCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker) { + super(lightOpenGlView); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + public RtmpCamera2(Context context, boolean useOpengl, ConnectCheckerRtmp connectChecker) { + super(context, useOpengl); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + /** + * H264 profile. + * + * @param profileIop Could be ProfileIop.BASELINE or ProfileIop.CONSTRAINED + */ + public void setProfileIop(byte profileIop) { + srsFlvMuxer.setProfileIop(profileIop); + } + + @Override + public void resizeCache(int newSize) throws RuntimeException { + srsFlvMuxer.resizeFlvTagCache(newSize); + } + + @Override + public int getCacheSize() { + return srsFlvMuxer.getFlvTagCacheSize(); + } + + @Override + public long getSentAudioFrames() { + return srsFlvMuxer.getSentAudioFrames(); + } + + @Override + public long getSentVideoFrames() { + return srsFlvMuxer.getSentVideoFrames(); + } + + @Override + public long getDroppedAudioFrames() { + return srsFlvMuxer.getDroppedAudioFrames(); + } + + @Override + public long getDroppedVideoFrames() { + return srsFlvMuxer.getDroppedVideoFrames(); + } + + @Override + public void resetSentAudioFrames() { + srsFlvMuxer.resetSentAudioFrames(); + } + + @Override + public void resetSentVideoFrames() { + srsFlvMuxer.resetSentVideoFrames(); + } + + @Override + public void resetDroppedAudioFrames() { + srsFlvMuxer.resetDroppedAudioFrames(); + } + + @Override + public void resetDroppedVideoFrames() { + srsFlvMuxer.resetDroppedVideoFrames(); + } + + @Override + public void setAuthorization(String user, String password) { + srsFlvMuxer.setAuthorization(user, password); + } + + @Override + protected void prepareAudioRtp(boolean isStereo, int sampleRate) { + srsFlvMuxer.setIsStereo(isStereo); + srsFlvMuxer.setSampleRate(sampleRate); + } + + @Override + protected void startStreamRtp(String url) { + if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) { + srsFlvMuxer.setVideoResolution(videoEncoder.getHeight(), videoEncoder.getWidth()); + } else { + srsFlvMuxer.setVideoResolution(videoEncoder.getWidth(), videoEncoder.getHeight()); + } + srsFlvMuxer.start(url); + } + + @Override + protected void stopStreamRtp() { + srsFlvMuxer.stop(); + } + + @Override + public void setReTries(int reTries) { + srsFlvMuxer.setReTries(reTries); + } + + @Override + public boolean shouldRetry(String reason) { + return srsFlvMuxer.shouldRetry(reason); + } + + @Override + public void reConnect(long delay) { + srsFlvMuxer.reConnect(delay); + } + + @Override + protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + srsFlvMuxer.sendAudio(aacBuffer, info); + } + + @Override + protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + srsFlvMuxer.setSpsPPs(sps, pps); + } + + @Override + protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + srsFlvMuxer.sendVideo(h264Buffer, info); + } +} + diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpDisplay.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpDisplay.java new file mode 100644 index 0000000..cae00ad --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpDisplay.java @@ -0,0 +1,145 @@ +package com.pedro.rtplibrary.rtmp; + +import android.content.Context; +import android.media.MediaCodec; +import android.os.Build; +import androidx.annotation.RequiresApi; + +import com.pedro.rtplibrary.base.DisplayBase; + +import net.ossrs.rtmp.ConnectCheckerRtmp; +import net.ossrs.rtmp.SrsFlvMuxer; + +import java.nio.ByteBuffer; + +/** + * More documentation see: + * {@link com.pedro.rtplibrary.base.DisplayBase} + * + * Created by pedro on 9/08/17. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +public class RtmpDisplay extends DisplayBase { + + private SrsFlvMuxer srsFlvMuxer; + + public RtmpDisplay(Context context, boolean useOpengl, ConnectCheckerRtmp connectChecker) { + super(context, useOpengl); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + /** + * H264 profile. + * + * @param profileIop Could be ProfileIop.BASELINE or ProfileIop.CONSTRAINED + */ + public void setProfileIop(byte profileIop) { + srsFlvMuxer.setProfileIop(profileIop); + } + + @Override + public void resizeCache(int newSize) throws RuntimeException { + srsFlvMuxer.resizeFlvTagCache(newSize); + } + + @Override + public int getCacheSize() { + return srsFlvMuxer.getFlvTagCacheSize(); + } + + @Override + public long getSentAudioFrames() { + return srsFlvMuxer.getSentAudioFrames(); + } + + @Override + public long getSentVideoFrames() { + return srsFlvMuxer.getSentVideoFrames(); + } + + @Override + public long getDroppedAudioFrames() { + return srsFlvMuxer.getDroppedAudioFrames(); + } + + @Override + public long getDroppedVideoFrames() { + return srsFlvMuxer.getDroppedVideoFrames(); + } + + @Override + public void resetSentAudioFrames() { + srsFlvMuxer.resetSentAudioFrames(); + } + + @Override + public void resetSentVideoFrames() { + srsFlvMuxer.resetSentVideoFrames(); + } + + @Override + public void resetDroppedAudioFrames() { + srsFlvMuxer.resetDroppedAudioFrames(); + } + + @Override + public void resetDroppedVideoFrames() { + srsFlvMuxer.resetDroppedVideoFrames(); + } + + @Override + public void setAuthorization(String user, String password) { + srsFlvMuxer.setAuthorization(user, password); + } + + @Override + protected void prepareAudioRtp(boolean isStereo, int sampleRate) { + srsFlvMuxer.setIsStereo(isStereo); + srsFlvMuxer.setSampleRate(sampleRate); + } + + @Override + protected void startStreamRtp(String url) { + if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) { + srsFlvMuxer.setVideoResolution(videoEncoder.getHeight(), videoEncoder.getWidth()); + } else { + srsFlvMuxer.setVideoResolution(videoEncoder.getWidth(), videoEncoder.getHeight()); + } + srsFlvMuxer.start(url); + } + + @Override + protected void stopStreamRtp() { + srsFlvMuxer.stop(); + } + + @Override + public void setReTries(int reTries) { + srsFlvMuxer.setReTries(reTries); + } + + @Override + public boolean shouldRetry(String reason) { + return srsFlvMuxer.shouldRetry(reason); + } + + @Override + public void reConnect(long delay) { + srsFlvMuxer.reConnect(delay); + } + + @Override + protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + srsFlvMuxer.sendAudio(aacBuffer, info); + } + + @Override + protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + srsFlvMuxer.setSpsPPs(sps, pps); + } + + @Override + protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + srsFlvMuxer.sendVideo(h264Buffer, info); + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpFromFile.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpFromFile.java new file mode 100644 index 0000000..8ca85c5 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpFromFile.java @@ -0,0 +1,168 @@ +package com.pedro.rtplibrary.rtmp; + +import android.content.Context; +import android.media.MediaCodec; +import android.os.Build; +import androidx.annotation.RequiresApi; + +import com.pedro.encoder.input.decoder.AudioDecoderInterface; +import com.pedro.encoder.input.decoder.VideoDecoderInterface; +import com.pedro.rtplibrary.base.FromFileBase; + +import com.pedro.rtplibrary.view.LightOpenGlView; +import com.pedro.rtplibrary.view.OpenGlView; +import net.ossrs.rtmp.ConnectCheckerRtmp; +import net.ossrs.rtmp.SrsFlvMuxer; + +import java.nio.ByteBuffer; + +/** + * More documentation see: + * {@link com.pedro.rtplibrary.base.FromFileBase} + * + * Created by pedro on 26/06/17. + */ +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class RtmpFromFile extends FromFileBase { + + private SrsFlvMuxer srsFlvMuxer; + + public RtmpFromFile(ConnectCheckerRtmp connectChecker, + VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { + super(videoDecoderInterface, audioDecoderInterface); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + public RtmpFromFile(Context context, ConnectCheckerRtmp connectChecker, + VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { + super(context, videoDecoderInterface, audioDecoderInterface); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + public RtmpFromFile(OpenGlView openGlView, ConnectCheckerRtmp connectChecker, + VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { + super(openGlView, videoDecoderInterface, audioDecoderInterface); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + public RtmpFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerRtmp connectChecker, + VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { + super(lightOpenGlView, videoDecoderInterface, audioDecoderInterface); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + /** + * H264 profile. + * + * @param profileIop Could be ProfileIop.BASELINE or ProfileIop.CONSTRAINED + */ + public void setProfileIop(byte profileIop) { + srsFlvMuxer.setProfileIop(profileIop); + } + + @Override + public void resizeCache(int newSize) throws RuntimeException { + srsFlvMuxer.resizeFlvTagCache(newSize); + } + + @Override + public int getCacheSize() { + return srsFlvMuxer.getFlvTagCacheSize(); + } + + @Override + public long getSentAudioFrames() { + return srsFlvMuxer.getSentAudioFrames(); + } + + @Override + public long getSentVideoFrames() { + return srsFlvMuxer.getSentVideoFrames(); + } + + @Override + public long getDroppedAudioFrames() { + return srsFlvMuxer.getDroppedAudioFrames(); + } + + @Override + public long getDroppedVideoFrames() { + return srsFlvMuxer.getDroppedVideoFrames(); + } + + @Override + public void resetSentAudioFrames() { + srsFlvMuxer.resetSentAudioFrames(); + } + + @Override + public void resetSentVideoFrames() { + srsFlvMuxer.resetSentVideoFrames(); + } + + @Override + public void resetDroppedAudioFrames() { + srsFlvMuxer.resetDroppedAudioFrames(); + } + + @Override + public void resetDroppedVideoFrames() { + srsFlvMuxer.resetDroppedVideoFrames(); + } + + @Override + public void setAuthorization(String user, String password) { + srsFlvMuxer.setAuthorization(user, password); + } + + @Override + protected void prepareAudioRtp(boolean isStereo, int sampleRate) { + srsFlvMuxer.setIsStereo(isStereo); + srsFlvMuxer.setSampleRate(sampleRate); + } + + @Override + protected void startStreamRtp(String url) { + if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) { + srsFlvMuxer.setVideoResolution(videoEncoder.getHeight(), videoEncoder.getWidth()); + } else { + srsFlvMuxer.setVideoResolution(videoEncoder.getWidth(), videoEncoder.getHeight()); + } + srsFlvMuxer.start(url); + } + + @Override + protected void stopStreamRtp() { + srsFlvMuxer.stop(); + } + + @Override + public void setReTries(int reTries) { + srsFlvMuxer.setReTries(reTries); + } + + @Override + public boolean shouldRetry(String reason) { + return srsFlvMuxer.shouldRetry(reason); + } + + @Override + public void reConnect(long delay) { + srsFlvMuxer.reConnect(delay); + } + + @Override + protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + srsFlvMuxer.setSpsPPs(sps, pps); + } + + @Override + protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + srsFlvMuxer.sendVideo(h264Buffer, info); + } + + @Override + protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + srsFlvMuxer.sendAudio(aacBuffer, info); + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpOnlyAudio.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpOnlyAudio.java new file mode 100644 index 0000000..2c6e9bd --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtmp/RtmpOnlyAudio.java @@ -0,0 +1,114 @@ +package com.pedro.rtplibrary.rtmp; + +import android.media.MediaCodec; +import com.pedro.rtplibrary.base.OnlyAudioBase; +import java.nio.ByteBuffer; +import net.ossrs.rtmp.ConnectCheckerRtmp; +import net.ossrs.rtmp.SrsFlvMuxer; + +/** + * More documentation see: + * {@link com.pedro.rtplibrary.base.OnlyAudioBase} + * + * Created by pedro on 10/07/18. + */ +public class RtmpOnlyAudio extends OnlyAudioBase { + + private SrsFlvMuxer srsFlvMuxer; + + public RtmpOnlyAudio(ConnectCheckerRtmp connectChecker) { + super(); + srsFlvMuxer = new SrsFlvMuxer(connectChecker); + } + + @Override + public void resizeCache(int newSize) throws RuntimeException { + srsFlvMuxer.resizeFlvTagCache(newSize); + } + + @Override + public int getCacheSize() { + return srsFlvMuxer.getFlvTagCacheSize(); + } + + @Override + public long getSentAudioFrames() { + return srsFlvMuxer.getSentAudioFrames(); + } + + @Override + public long getSentVideoFrames() { + return srsFlvMuxer.getSentVideoFrames(); + } + + @Override + public long getDroppedAudioFrames() { + return srsFlvMuxer.getDroppedAudioFrames(); + } + + @Override + public long getDroppedVideoFrames() { + return srsFlvMuxer.getDroppedVideoFrames(); + } + + @Override + public void resetSentAudioFrames() { + srsFlvMuxer.resetSentAudioFrames(); + } + + @Override + public void resetSentVideoFrames() { + srsFlvMuxer.resetSentVideoFrames(); + } + + @Override + public void resetDroppedAudioFrames() { + srsFlvMuxer.resetDroppedAudioFrames(); + } + + @Override + public void resetDroppedVideoFrames() { + srsFlvMuxer.resetDroppedVideoFrames(); + } + + @Override + public void setAuthorization(String user, String password) { + srsFlvMuxer.setAuthorization(user, password); + } + + @Override + protected void prepareAudioRtp(boolean isStereo, int sampleRate) { + srsFlvMuxer.setIsStereo(isStereo); + srsFlvMuxer.setSampleRate(sampleRate); + } + + @Override + protected void startStreamRtp(String url) { + srsFlvMuxer.start(url); + } + + @Override + protected void stopStreamRtp() { + srsFlvMuxer.stop(); + } + + @Override + public void setReTries(int reTries) { + srsFlvMuxer.setReTries(reTries); + } + + @Override + public boolean shouldRetry(String reason) { + return srsFlvMuxer.shouldRetry(reason); + } + + @Override + public void reConnect(long delay) { + srsFlvMuxer.reConnect(delay); + } + + @Override + protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + srsFlvMuxer.sendAudio(aacBuffer, info); + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera1.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera1.java new file mode 100644 index 0000000..70a9b20 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera1.java @@ -0,0 +1,175 @@ +package com.pedro.rtplibrary.rtsp; + +import android.content.Context; +import android.media.MediaCodec; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.view.SurfaceView; +import android.view.TextureView; +import com.pedro.encoder.utils.CodecUtil; +import com.pedro.rtplibrary.base.Camera1Base; +import com.pedro.rtplibrary.view.LightOpenGlView; +import com.pedro.rtplibrary.view.OpenGlView; +import com.pedro.rtsp.rtsp.Protocol; +import com.pedro.rtsp.rtsp.RtspClient; +import com.pedro.rtsp.rtsp.VideoCodec; +import com.pedro.rtsp.utils.ConnectCheckerRtsp; +import java.nio.ByteBuffer; + +/** + * More documentation see: + * {@link com.pedro.rtplibrary.base.Camera1Base} + * + * Created by pedro on 10/02/17. + */ + +public class RtspCamera1 extends Camera1Base { + + private RtspClient rtspClient; + + public RtspCamera1(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRtsp) { + super(surfaceView); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + public RtspCamera1(TextureView textureView, ConnectCheckerRtsp connectCheckerRtsp) { + super(textureView); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public RtspCamera1(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp) { + super(openGlView); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public RtspCamera1(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp) { + super(lightOpenGlView); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public RtspCamera1(Context context, ConnectCheckerRtsp connectCheckerRtsp) { + super(context); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + /** + * Internet protocol used. + * + * @param protocol Could be Protocol.TCP or Protocol.UDP. + */ + public void setProtocol(Protocol protocol) { + rtspClient.setProtocol(protocol); + } + + @Override + public void resizeCache(int newSize) throws RuntimeException { + rtspClient.resizeCache(newSize); + } + + @Override + public int getCacheSize() { + return rtspClient.getCacheSize(); + } + + @Override + public long getSentAudioFrames() { + return rtspClient.getSentAudioFrames(); + } + + @Override + public long getSentVideoFrames() { + return rtspClient.getSentVideoFrames(); + } + + @Override + public long getDroppedAudioFrames() { + return rtspClient.getDroppedAudioFrames(); + } + + @Override + public long getDroppedVideoFrames() { + return rtspClient.getDroppedVideoFrames(); + } + + @Override + public void resetSentAudioFrames() { + rtspClient.resetSentAudioFrames(); + } + + @Override + public void resetSentVideoFrames() { + rtspClient.resetSentVideoFrames(); + } + + @Override + public void resetDroppedAudioFrames() { + rtspClient.resetDroppedAudioFrames(); + } + + @Override + public void resetDroppedVideoFrames() { + rtspClient.resetDroppedVideoFrames(); + } + + public void setVideoCodec(VideoCodec videoCodec) { + videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME); + } + + @Override + public void setAuthorization(String user, String password) { + rtspClient.setAuthorization(user, password); + } + + @Override + protected void prepareAudioRtp(boolean isStereo, int sampleRate) { + rtspClient.setIsStereo(isStereo); + rtspClient.setSampleRate(sampleRate); + } + + @Override + protected void startStreamRtp(String url) { + rtspClient.setUrl(url); + } + + @Override + protected void stopStreamRtp() { + rtspClient.disconnect(); + } + + @Override + public void setReTries(int reTries) { + rtspClient.setReTries(reTries); + } + + @Override + public boolean shouldRetry(String reason) { + return rtspClient.shouldRetry(reason); + } + + @Override + public void reConnect(long delay) { + rtspClient.reConnect(delay); + } + + @Override + protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + rtspClient.sendAudio(aacBuffer, info); + } + + @Override + protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + ByteBuffer newSps = sps.duplicate(); + ByteBuffer newPps = pps.duplicate(); + ByteBuffer newVps = vps != null ? vps.duplicate() : null; + rtspClient.setSPSandPPS(newSps, newPps, newVps); + rtspClient.connect(); + } + + @Override + protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + rtspClient.sendVideo(h264Buffer, info); + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera2.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera2.java new file mode 100644 index 0000000..981aa19 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspCamera2.java @@ -0,0 +1,175 @@ +package com.pedro.rtplibrary.rtsp; + +import android.content.Context; +import android.media.MediaCodec; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.view.SurfaceView; +import android.view.TextureView; + +import com.pedro.encoder.utils.CodecUtil; +import com.pedro.rtplibrary.base.Camera2Base; +import com.pedro.rtplibrary.view.LightOpenGlView; +import com.pedro.rtplibrary.view.OpenGlView; +import com.pedro.rtsp.rtsp.Protocol; +import com.pedro.rtsp.rtsp.RtspClient; +import com.pedro.rtsp.rtsp.VideoCodec; +import com.pedro.rtsp.utils.ConnectCheckerRtsp; + +import java.nio.ByteBuffer; + +/** + * More documentation see: + * {@link com.pedro.rtplibrary.base.Camera2Base} + * + * Created by pedro on 4/06/17. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +public class RtspCamera2 extends Camera2Base { + + private RtspClient rtspClient; + + public RtspCamera2(SurfaceView surfaceView, ConnectCheckerRtsp connectCheckerRtsp) { + super(surfaceView); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + public RtspCamera2(TextureView textureView, ConnectCheckerRtsp connectCheckerRtsp) { + super(textureView); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + public RtspCamera2(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp) { + super(openGlView); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + public RtspCamera2(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp) { + super(lightOpenGlView); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + public RtspCamera2(Context context, boolean useOpengl, ConnectCheckerRtsp connectCheckerRtsp) { + super(context, useOpengl); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + /** + * Internet protocol used. + * + * @param protocol Could be Protocol.TCP or Protocol.UDP. + */ + public void setProtocol(Protocol protocol) { + rtspClient.setProtocol(protocol); + } + + @Override + public void resizeCache(int newSize) throws RuntimeException { + rtspClient.resizeCache(newSize); + } + + @Override + public int getCacheSize() { + return rtspClient.getCacheSize(); + } + + @Override + public long getSentAudioFrames() { + return rtspClient.getSentAudioFrames(); + } + + @Override + public long getSentVideoFrames() { + return rtspClient.getSentVideoFrames(); + } + + @Override + public long getDroppedAudioFrames() { + return rtspClient.getDroppedAudioFrames(); + } + + @Override + public long getDroppedVideoFrames() { + return rtspClient.getDroppedVideoFrames(); + } + + @Override + public void resetSentAudioFrames() { + rtspClient.resetSentAudioFrames(); + } + + @Override + public void resetSentVideoFrames() { + rtspClient.resetSentVideoFrames(); + } + + @Override + public void resetDroppedAudioFrames() { + rtspClient.resetDroppedAudioFrames(); + } + + @Override + public void resetDroppedVideoFrames() { + rtspClient.resetDroppedVideoFrames(); + } + + public void setVideoCodec(VideoCodec videoCodec) { + videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME); + } + + @Override + public void setAuthorization(String user, String password) { + rtspClient.setAuthorization(user, password); + } + + @Override + protected void prepareAudioRtp(boolean isStereo, int sampleRate) { + rtspClient.setIsStereo(isStereo); + rtspClient.setSampleRate(sampleRate); + } + + @Override + protected void startStreamRtp(String url) { + rtspClient.setUrl(url); + } + + @Override + protected void stopStreamRtp() { + rtspClient.disconnect(); + } + + @Override + public void setReTries(int reTries) { + rtspClient.setReTries(reTries); + } + + @Override + public boolean shouldRetry(String reason) { + return rtspClient.shouldRetry(reason); + } + + @Override + public void reConnect(long delay) { + rtspClient.reConnect(delay); + } + + @Override + protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + rtspClient.sendAudio(aacBuffer, info); + } + + @Override + protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + ByteBuffer newSps = sps.duplicate(); + ByteBuffer newPps = pps.duplicate(); + ByteBuffer newVps = vps != null ? vps.duplicate() : null; + rtspClient.setSPSandPPS(newSps, newPps, newVps); + rtspClient.connect(); + } + + @Override + protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + rtspClient.sendVideo(h264Buffer, info); + } +} + diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspDisplay.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspDisplay.java new file mode 100644 index 0000000..0221170 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspDisplay.java @@ -0,0 +1,148 @@ +package com.pedro.rtplibrary.rtsp; + +import android.content.Context; +import android.media.MediaCodec; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.utils.CodecUtil; +import com.pedro.rtplibrary.base.DisplayBase; +import com.pedro.rtsp.rtsp.Protocol; +import com.pedro.rtsp.rtsp.RtspClient; +import com.pedro.rtsp.rtsp.VideoCodec; +import com.pedro.rtsp.utils.ConnectCheckerRtsp; +import java.nio.ByteBuffer; + +/** + * More documentation see: + * {@link com.pedro.rtplibrary.base.DisplayBase} + * + * Created by pedro on 9/08/17. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +public class RtspDisplay extends DisplayBase { + + private RtspClient rtspClient; + + public RtspDisplay(Context context, boolean useOpengl, ConnectCheckerRtsp connectCheckerRtsp) { + super(context, useOpengl); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + /** + * Internet protocol used. + * + * @param protocol Could be Protocol.TCP or Protocol.UDP. + */ + public void setProtocol(Protocol protocol) { + rtspClient.setProtocol(protocol); + } + + @Override + public void resizeCache(int newSize) throws RuntimeException { + rtspClient.resizeCache(newSize); + } + + @Override + public int getCacheSize() { + return rtspClient.getCacheSize(); + } + + @Override + public long getSentAudioFrames() { + return rtspClient.getSentAudioFrames(); + } + + @Override + public long getSentVideoFrames() { + return rtspClient.getSentVideoFrames(); + } + + @Override + public long getDroppedAudioFrames() { + return rtspClient.getDroppedAudioFrames(); + } + + @Override + public long getDroppedVideoFrames() { + return rtspClient.getDroppedVideoFrames(); + } + + @Override + public void resetSentAudioFrames() { + rtspClient.resetSentAudioFrames(); + } + + @Override + public void resetSentVideoFrames() { + rtspClient.resetSentVideoFrames(); + } + + @Override + public void resetDroppedAudioFrames() { + rtspClient.resetDroppedAudioFrames(); + } + + @Override + public void resetDroppedVideoFrames() { + rtspClient.resetDroppedVideoFrames(); + } + + public void setVideoCodec(VideoCodec videoCodec) { + videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME); + } + + @Override + public void setAuthorization(String user, String password) { + rtspClient.setAuthorization(user, password); + } + + @Override + protected void prepareAudioRtp(boolean isStereo, int sampleRate) { + rtspClient.setIsStereo(isStereo); + rtspClient.setSampleRate(sampleRate); + } + + @Override + protected void startStreamRtp(String url) { + rtspClient.setUrl(url); + } + + @Override + protected void stopStreamRtp() { + rtspClient.disconnect(); + } + + @Override + public void setReTries(int reTries) { + rtspClient.setReTries(reTries); + } + + @Override + public boolean shouldRetry(String reason) { + return rtspClient.shouldRetry(reason); + } + + @Override + public void reConnect(long delay) { + rtspClient.reConnect(delay); + } + + @Override + protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + rtspClient.sendAudio(aacBuffer, info); + } + + @Override + protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + ByteBuffer newSps = sps.duplicate(); + ByteBuffer newPps = pps.duplicate(); + ByteBuffer newVps = vps != null ? vps.duplicate() : null; + rtspClient.setSPSandPPS(newSps, newPps, newVps); + rtspClient.connect(); + } + + @Override + protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + rtspClient.sendVideo(h264Buffer, info); + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspFromFile.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspFromFile.java new file mode 100644 index 0000000..d3f975e --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspFromFile.java @@ -0,0 +1,172 @@ +package com.pedro.rtplibrary.rtsp; + +import android.content.Context; +import android.media.MediaCodec; +import android.os.Build; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.input.decoder.AudioDecoderInterface; +import com.pedro.encoder.input.decoder.VideoDecoderInterface; +import com.pedro.encoder.utils.CodecUtil; +import com.pedro.rtplibrary.base.FromFileBase; +import com.pedro.rtplibrary.view.LightOpenGlView; +import com.pedro.rtplibrary.view.OpenGlView; +import com.pedro.rtsp.rtsp.Protocol; +import com.pedro.rtsp.rtsp.RtspClient; +import com.pedro.rtsp.rtsp.VideoCodec; +import com.pedro.rtsp.utils.ConnectCheckerRtsp; +import java.nio.ByteBuffer; + +/** + * More documentation see: + * {@link com.pedro.rtplibrary.base.FromFileBase} + * + * Created by pedro on 4/06/17. + */ +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class RtspFromFile extends FromFileBase { + + private RtspClient rtspClient; + + public RtspFromFile(ConnectCheckerRtsp connectCheckerRtsp, + VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { + super(videoDecoderInterface, audioDecoderInterface); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + public RtspFromFile(Context context, ConnectCheckerRtsp connectCheckerRtsp, + VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { + super(context, videoDecoderInterface, audioDecoderInterface); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + public RtspFromFile(OpenGlView openGlView, ConnectCheckerRtsp connectCheckerRtsp, + VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { + super(openGlView, videoDecoderInterface, audioDecoderInterface); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + public RtspFromFile(LightOpenGlView lightOpenGlView, ConnectCheckerRtsp connectCheckerRtsp, + VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { + super(lightOpenGlView, videoDecoderInterface, audioDecoderInterface); + rtspClient = new RtspClient(connectCheckerRtsp); + } + + /** + * Internet protocol used. + * + * @param protocol Could be Protocol.TCP or Protocol.UDP. + */ + public void setProtocol(Protocol protocol) { + rtspClient.setProtocol(protocol); + } + + @Override + public void resizeCache(int newSize) throws RuntimeException { + rtspClient.resizeCache(newSize); + } + + @Override + public int getCacheSize() { + return rtspClient.getCacheSize(); + } + + @Override + public long getSentAudioFrames() { + return rtspClient.getSentAudioFrames(); + } + + @Override + public long getSentVideoFrames() { + return rtspClient.getSentVideoFrames(); + } + + @Override + public long getDroppedAudioFrames() { + return rtspClient.getDroppedAudioFrames(); + } + + @Override + public long getDroppedVideoFrames() { + return rtspClient.getDroppedVideoFrames(); + } + + @Override + public void resetSentAudioFrames() { + rtspClient.resetSentAudioFrames(); + } + + @Override + public void resetSentVideoFrames() { + rtspClient.resetSentVideoFrames(); + } + + @Override + public void resetDroppedAudioFrames() { + rtspClient.resetDroppedAudioFrames(); + } + + @Override + public void resetDroppedVideoFrames() { + rtspClient.resetDroppedVideoFrames(); + } + + public void setVideoCodec(VideoCodec videoCodec) { + videoEncoder.setType(videoCodec == VideoCodec.H265 ? CodecUtil.H265_MIME : CodecUtil.H264_MIME); + } + + @Override + public void setAuthorization(String user, String password) { + rtspClient.setAuthorization(user, password); + } + + @Override + protected void prepareAudioRtp(boolean isStereo, int sampleRate) { + rtspClient.setIsStereo(isStereo); + rtspClient.setSampleRate(sampleRate); + } + + @Override + protected void startStreamRtp(String url) { + rtspClient.setUrl(url); + } + + @Override + protected void stopStreamRtp() { + rtspClient.disconnect(); + } + + @Override + public void setReTries(int reTries) { + rtspClient.setReTries(reTries); + } + + @Override + public boolean shouldRetry(String reason) { + return rtspClient.shouldRetry(reason); + } + + @Override + public void reConnect(long delay) { + rtspClient.reConnect(delay); + } + + @Override + protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + ByteBuffer newSps = sps.duplicate(); + ByteBuffer newPps = pps.duplicate(); + ByteBuffer newVps = vps != null ? vps.duplicate() : null; + rtspClient.setSPSandPPS(newSps, newPps, newVps); + rtspClient.connect(); + } + + @Override + protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + rtspClient.sendVideo(h264Buffer, info); + } + + @Override + protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + rtspClient.sendAudio(aacBuffer, info); + } +} + diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspOnlyAudio.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspOnlyAudio.java new file mode 100644 index 0000000..528d801 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/rtsp/RtspOnlyAudio.java @@ -0,0 +1,126 @@ +package com.pedro.rtplibrary.rtsp; + +import android.media.MediaCodec; +import com.pedro.rtplibrary.base.OnlyAudioBase; +import com.pedro.rtsp.rtsp.Protocol; +import com.pedro.rtsp.rtsp.RtspClient; +import com.pedro.rtsp.utils.ConnectCheckerRtsp; +import java.nio.ByteBuffer; + +/** + * More documentation see: + * {@link com.pedro.rtplibrary.base.OnlyAudioBase} + * + * Created by pedro on 10/07/18. + */ +public class RtspOnlyAudio extends OnlyAudioBase { + + private RtspClient rtspClient; + + public RtspOnlyAudio(ConnectCheckerRtsp connectCheckerRtsp) { + super(); + rtspClient = new RtspClient(connectCheckerRtsp); + rtspClient.setOnlyAudio(true); + } + + /** + * Internet protocol used. + * + * @param protocol Could be Protocol.TCP or Protocol.UDP. + */ + public void setProtocol(Protocol protocol) { + rtspClient.setProtocol(protocol); + } + + @Override + public void resizeCache(int newSize) throws RuntimeException { + rtspClient.resizeCache(newSize); + } + + @Override + public int getCacheSize() { + return rtspClient.getCacheSize(); + } + + @Override + public long getSentAudioFrames() { + return rtspClient.getSentAudioFrames(); + } + + @Override + public long getSentVideoFrames() { + return rtspClient.getSentVideoFrames(); + } + + @Override + public long getDroppedAudioFrames() { + return rtspClient.getDroppedAudioFrames(); + } + + @Override + public long getDroppedVideoFrames() { + return rtspClient.getDroppedVideoFrames(); + } + + @Override + public void resetSentAudioFrames() { + rtspClient.resetSentAudioFrames(); + } + + @Override + public void resetSentVideoFrames() { + rtspClient.resetSentVideoFrames(); + } + + @Override + public void resetDroppedAudioFrames() { + rtspClient.resetDroppedAudioFrames(); + } + + @Override + public void resetDroppedVideoFrames() { + rtspClient.resetDroppedVideoFrames(); + } + + @Override + public void setAuthorization(String user, String password) { + rtspClient.setAuthorization(user, password); + } + + @Override + protected void prepareAudioRtp(boolean isStereo, int sampleRate) { + rtspClient.setIsStereo(isStereo); + rtspClient.setSampleRate(sampleRate); + } + + @Override + protected void startStreamRtp(String url) { + rtspClient.setUrl(url); + rtspClient.connect(); + } + + @Override + protected void stopStreamRtp() { + rtspClient.disconnect(); + } + + @Override + public void setReTries(int reTries) { + rtspClient.setReTries(reTries); + } + + @Override + public boolean shouldRetry(String reason) { + return rtspClient.shouldRetry(reason); + } + + @Override + public void reConnect(long delay) { + rtspClient.reConnect(delay); + } + + @Override + protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + rtspClient.sendAudio(aacBuffer, info); + } +} \ No newline at end of file diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/util/BitrateAdapter.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/util/BitrateAdapter.java new file mode 100644 index 0000000..023ff6c --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/util/BitrateAdapter.java @@ -0,0 +1,57 @@ +package com.pedro.rtplibrary.util; + +/** + * Created by pedro on 11/07/19. + */ +public class BitrateAdapter { + + public interface Listener { + void onBitrateAdapted(int bitrate); + } + + private int maxBitrate; + private int oldBitrate; + private int averageBitrate; + private int cont; + private Listener listener; + + public BitrateAdapter(Listener listener) { + this.listener = listener; + reset(); + } + + public void setMaxBitrate(int bitrate) { + this.maxBitrate = bitrate; + this.oldBitrate = bitrate; + reset(); + } + + public void adaptBitrate(long actualBitrate) { + averageBitrate += actualBitrate; + averageBitrate /= 2; + cont++; + if (cont >= 5) { + if (listener != null && maxBitrate != 0) { + listener.onBitrateAdapted(getBitrateAdapted(averageBitrate)); + reset(); + } + } + } + + private int getBitrateAdapted(int bitrate) { + if (bitrate >= maxBitrate) { //You have high speed and max bitrate. Keep max speed + oldBitrate = maxBitrate; + } else if (bitrate <= oldBitrate * 0.9f) { //You have low speed and bitrate too high. Reduce bitrate by 10%. + oldBitrate = (int) (bitrate * 0.9); + } else { //You have high speed and bitrate too low. Increase bitrate by 10%. + oldBitrate = (int) (bitrate * 1.1); + if (oldBitrate > maxBitrate) oldBitrate = maxBitrate; + } + return oldBitrate; + } + + public void reset() { + averageBitrate = 0; + cont = 0; + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/util/FpsListener.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/util/FpsListener.java new file mode 100644 index 0000000..80948ff --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/util/FpsListener.java @@ -0,0 +1,28 @@ +package com.pedro.rtplibrary.util; + +/** + * Created by pedro on 09/07/19. + */ +public class FpsListener { + + private int fpsCont = 0; + private long ts = System.currentTimeMillis(); + private Callback callback; + + public interface Callback { + void onFps(int fps); + } + + public void setCallback(Callback callback) { + this.callback = callback; + } + + public void calculateFps() { + fpsCont++; + if (System.currentTimeMillis() - ts >= 1000) { + if (callback != null) callback.onFps(fpsCont); + fpsCont = 0; + ts = System.currentTimeMillis(); + } + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/util/RecordController.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/util/RecordController.java new file mode 100644 index 0000000..d538274 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/util/RecordController.java @@ -0,0 +1,144 @@ +package com.pedro.rtplibrary.util; + +import android.media.MediaCodec; +import android.media.MediaFormat; +import android.media.MediaMuxer; +import android.os.Build; +import androidx.annotation.RequiresApi; +import java.io.IOException; +import java.nio.ByteBuffer; + +/** + * Created by pedro on 08/03/19. + * + * Class to control video recording with MediaMuxer. + */ +public class RecordController { + + private Status status = Status.STOPPED; + private MediaMuxer mediaMuxer; + private MediaFormat videoFormat, audioFormat; + private int videoTrack = -1; + private int audioTrack = -1; + private Listener listener; + //Pause/Resume + private long pauseMoment = 0; + private long pauseTime = 0; + private MediaCodec.BufferInfo videoInfo = new MediaCodec.BufferInfo(); + private MediaCodec.BufferInfo audioInfo = new MediaCodec.BufferInfo(); + + public enum Status { + STARTED, STOPPED, RECORDING, PAUSED, RESUMED + } + + public interface Listener { + void onStatusChange(Status status); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public void startRecord(String path, Listener listener) throws IOException { + mediaMuxer = new MediaMuxer(path, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); + this.listener = listener; + status = Status.STARTED; + if (listener != null) listener.onStatusChange(status); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public void stopRecord() { + status = Status.STOPPED; + if (mediaMuxer != null) { + try { + mediaMuxer.stop(); + mediaMuxer.release(); + } catch (Exception ignored) { + } + } + mediaMuxer = null; + videoTrack = -1; + audioTrack = -1; + pauseMoment = 0; + pauseTime = 0; + if (listener != null) listener.onStatusChange(status); + } + + public boolean isRunning() { + return status == Status.STARTED + || status == Status.RECORDING + || status == Status.RESUMED + || status == Status.PAUSED; + } + + public boolean isRecording() { + return status == Status.RECORDING; + } + + public Status getStatus() { + return status; + } + + public void resetFormats() { + videoFormat = null; + audioFormat = null; + } + + public void pauseRecord() { + if (status == Status.RECORDING) { + pauseMoment = System.nanoTime() / 1000; + status = Status.PAUSED; + if (listener != null) listener.onStatusChange(status); + } + } + + public void resumeRecord() { + if (status == Status.PAUSED) { + pauseTime += System.nanoTime() / 1000 - pauseMoment; + status = Status.RESUMED; + if (listener != null) listener.onStatusChange(status); + } + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public void recordVideo(ByteBuffer videoBuffer, MediaCodec.BufferInfo videoInfo) { + if (status == Status.STARTED + && videoInfo.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME + && videoFormat != null + && audioFormat != null) { + videoTrack = mediaMuxer.addTrack(videoFormat); + audioTrack = mediaMuxer.addTrack(audioFormat); + mediaMuxer.start(); + status = Status.RECORDING; + if (listener != null) listener.onStatusChange(status); + } else if (status == Status.RESUMED && videoInfo.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME) { + status = Status.RECORDING; + if (listener != null) listener.onStatusChange(status); + } + if (status == Status.RECORDING) { + updateFormat(this.videoInfo, videoInfo); + mediaMuxer.writeSampleData(videoTrack, videoBuffer, this.videoInfo); + } + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public void recordAudio(ByteBuffer audioBuffer, MediaCodec.BufferInfo audioInfo) { + if (status == Status.RECORDING) { + updateFormat(this.audioInfo, audioInfo); + mediaMuxer.writeSampleData(audioTrack, audioBuffer, this.audioInfo); + } + } + + public void setVideoFormat(MediaFormat videoFormat) { + this.videoFormat = videoFormat; + } + + public void setAudioFormat(MediaFormat audioFormat) { + this.audioFormat = audioFormat; + } + + //We can't reuse info because could produce stream issues + private void updateFormat(MediaCodec.BufferInfo newInfo, MediaCodec.BufferInfo oldInfo) { + newInfo.flags = oldInfo.flags; + newInfo.offset = oldInfo.offset; + newInfo.size = oldInfo.size; + newInfo.presentationTimeUs = oldInfo.presentationTimeUs - pauseTime; + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/util/SensorRotationManager.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/util/SensorRotationManager.java new file mode 100644 index 0000000..3346e05 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/util/SensorRotationManager.java @@ -0,0 +1,33 @@ +package com.pedro.rtplibrary.util; + +import android.content.Context; +import android.hardware.SensorManager; +import android.view.OrientationEventListener; + +public class SensorRotationManager { + + private final OrientationEventListener listener; + + public interface RotationChangedListener { + void onRotationChanged(int rotation); + } + + public SensorRotationManager(Context context, final RotationChangedListener rotationListener) { + this.listener = new OrientationEventListener(context, SensorManager.SENSOR_DELAY_NORMAL) { + @Override + public void onOrientationChanged(int sensorOrientation) { + final int rotation = ((sensorOrientation + 45) / 90) % 4; + final int rotationDegrees = rotation * 90; + rotationListener.onRotationChanged(rotationDegrees); + } + }; + } + + public void start() { + if (listener.canDetectOrientation()) listener.enable(); + } + + public void stop() { + listener.disable(); + } +} \ No newline at end of file diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/AutoFitTextureView.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/AutoFitTextureView.java new file mode 100644 index 0000000..03d9cfc --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/AutoFitTextureView.java @@ -0,0 +1,75 @@ +/* + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.pedro.rtplibrary.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.TextureView; + +/** + * A {@link TextureView} that can be adjusted to a specified aspect ratio. + */ +public class AutoFitTextureView extends TextureView { + + private int mRatioWidth = 0; + private int mRatioHeight = 0; + + public AutoFitTextureView(Context context) { + this(context, null); + } + + public AutoFitTextureView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public AutoFitTextureView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + /** + * Sets the aspect ratio for this view. The size of the view will be measured based on the ratio + * calculated from the parameters. Note that the actual sizes of parameters don't matter, that + * is, calling setAspectRatio(2, 3) and setAspectRatio(4, 6) make the same result. + * + * @param width Relative horizontal size + * @param height Relative vertical size + */ + public void setAspectRatio(int width, int height) { + if (width < 0 || height < 0) { + throw new IllegalArgumentException("Size cannot be negative."); + } + mRatioWidth = width; + mRatioHeight = height; + requestLayout(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (0 == mRatioWidth || 0 == mRatioHeight) { + setMeasuredDimension(width, height); + } else { + if (width < height * mRatioWidth / mRatioHeight) { + setMeasuredDimension(width, width * mRatioHeight / mRatioWidth); + } else { + setMeasuredDimension(height * mRatioWidth / mRatioHeight, height); + } + } + } +} \ No newline at end of file diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/Filter.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/Filter.java new file mode 100644 index 0000000..a215b55 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/Filter.java @@ -0,0 +1,37 @@ +package com.pedro.rtplibrary.view; + +import com.pedro.encoder.input.gl.render.filters.BaseFilterRender; + +/** + * Created by pedro on 30/07/18. + */ + +public class Filter { + + private int position; + private BaseFilterRender baseFilterRender; + + public Filter() { + } + + public Filter(int position, BaseFilterRender baseFilterRender) { + this.position = position; + this.baseFilterRender = baseFilterRender; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public BaseFilterRender getBaseFilterRender() { + return baseFilterRender; + } + + public void setBaseFilterRender(BaseFilterRender baseFilterRender) { + this.baseFilterRender = baseFilterRender; + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/GlInterface.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/GlInterface.java new file mode 100644 index 0000000..4daa95b --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/GlInterface.java @@ -0,0 +1,103 @@ +package com.pedro.rtplibrary.view; + +import android.graphics.SurfaceTexture; +import android.view.Surface; +import com.pedro.encoder.input.gl.render.filters.BaseFilterRender; + +public interface GlInterface { + + /** + * Initialize necessary classes. + */ + void init(); + + /** + * Set video encoder size use to Opengl + * @param width video encoder width in px + * @param height video encoder height in px + */ + void setEncoderSize(int width, int height); + + /** + * Get SurfaceTexture generated by Opengl. This should be called after start render. + * @return surface texture generated by Opengl. + */ + SurfaceTexture getSurfaceTexture(); + + /** + * Get Surface generated by Opengl. This should be called after start render. + * @return surface texture generated by Opengl. + */ + Surface getSurface(); + + /** + * Set surface from MediaCodec class to Opengl. + * This surface is used to copy pixels from Opengl surface to this surface and encode this pixels. + * @param surface surface created from MediaCodec. + */ + void addMediaCodecSurface(Surface surface); + + /** + * Remove surface generated from MediaCodec. + */ + void removeMediaCodecSurface(); + + /** + * Capture an Image from Opengl. + * + * @param takePhotoCallback callback where you will get your image like a bitmap. + */ + void takePhoto(TakePhotoCallback takePhotoCallback); + + /** + * Set a filter to stream. + * You can select any filter from {@link com.pedro.encoder.input.gl.render.filters} or create + * your own filter if you extends from {@link com.pedro.encoder.input.gl.render.filters.BaseFilterRender} + * + * @param baseFilterRender filter to set. You can modify parameters to filter after set it to stream. + */ + void setFilter(int filterPosition, BaseFilterRender baseFilterRender); + + /** + * Set filter in position 0. + * @param baseFilterRender filter to set. You can modify parameters to filter after set it to stream. + */ + void setFilter(BaseFilterRender baseFilterRender); + + /** + * Enable or disable Anti aliasing (This method use FXAA). + * + * @param AAEnabled true is AA enabled, false is AA disabled. False by default. + */ + void enableAA(boolean AAEnabled); + + void setRotation(int rotation); + + /** + * @param rotation change stream rotation on fly. No effect to preview + */ + void setStreamRotation(int rotation); + + /** + * Get Anti alias is enabled. + * @return true is enabled, false is disabled. + */ + boolean isAAEnabled(); + + /** + * INTERNAL METHOD. + * + * Start Opengl rendering. + * + */ + void start(); + + /** + * INTERNAL METHOD. + * + * Stop Opengl rendering. + */ + void stop(); + + void setFps(int fps); +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/LightOpenGlView.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/LightOpenGlView.java new file mode 100644 index 0000000..faf6154 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/LightOpenGlView.java @@ -0,0 +1,144 @@ +package com.pedro.rtplibrary.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.SurfaceTexture; +import android.os.Build; +import android.util.Log; +import android.view.SurfaceHolder; +import androidx.annotation.RequiresApi; +import android.util.AttributeSet; +import android.view.Surface; +import com.pedro.encoder.input.gl.SurfaceManager; +import com.pedro.encoder.input.gl.render.SimpleCameraRender; +import com.pedro.encoder.input.gl.render.filters.BaseFilterRender; +import com.pedro.encoder.utils.gl.GlUtil; +import com.pedro.rtplibrary.R; + +/** + * Created by pedro on 21/02/18. + * + * Light version of OpenGlView for devices too slow. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class LightOpenGlView extends OpenGlViewBase { + + private SimpleCameraRender simpleCameraRender = null; + private boolean keepAspectRatio = false; + private int aspectRatioMode = 0; + private boolean isFlipHorizontal = false, isFlipVertical = false; + + public LightOpenGlView(Context context) { + super(context); + } + + public LightOpenGlView(Context context, AttributeSet attrs) { + super(context, attrs); + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.LightOpenGlView); + try { + keepAspectRatio = typedArray.getBoolean(R.styleable.LightOpenGlView_keepAspectRatio, false); + aspectRatioMode = typedArray.getInt(R.styleable.OpenGlView_aspectRatioMode, 0); + isFlipHorizontal = typedArray.getBoolean(R.styleable.LightOpenGlView_isFlipHorizontal, false); + isFlipVertical = typedArray.getBoolean(R.styleable.LightOpenGlView_isFlipVertical, false); + } finally { + typedArray.recycle(); + } + } + + @Override + public void init() { + if (!initialized) simpleCameraRender = new SimpleCameraRender(); + simpleCameraRender.setFlip(isFlipHorizontal, isFlipVertical); + initialized = true; + } + + public boolean isKeepAspectRatio() { + return keepAspectRatio; + } + + public void setKeepAspectRatio(boolean keepAspectRatio) { + this.keepAspectRatio = keepAspectRatio; + } + + public void setCameraFlip(boolean isFlipHorizontal, boolean isFlipVertical) { + simpleCameraRender.setFlip(isFlipHorizontal, isFlipVertical); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + Log.i(TAG, "size: " + width + "x" + height); + this.previewWidth = width; + this.previewHeight = height; + } + + @Override + public void run() { + releaseSurfaceManager(); + surfaceManager = new SurfaceManager(getHolder().getSurface()); + surfaceManager.makeCurrent(); + simpleCameraRender.initGl(getContext(), encoderWidth, encoderHeight); + simpleCameraRender.getSurfaceTexture().setOnFrameAvailableListener(this); + semaphore.release(); + while (running) { + if (frameAvailable) { + frameAvailable = false; + surfaceManager.makeCurrent(); + simpleCameraRender.updateFrame(); + simpleCameraRender.drawFrame(previewWidth, previewHeight, keepAspectRatio, aspectRatioMode, + 0, true); + surfaceManager.swapBuffer(); + if (takePhotoCallback != null) { + takePhotoCallback.onTakePhoto( + GlUtil.getBitmap(previewWidth, previewHeight, encoderWidth, encoderHeight)); + takePhotoCallback = null; + } + synchronized (sync) { + if (surfaceManagerEncoder != null && !fpsLimiter.limitFPS()) { + surfaceManagerEncoder.makeCurrent(); + simpleCameraRender.drawFrame(encoderWidth, encoderHeight, false, aspectRatioMode, + streamRotation, false); + surfaceManagerEncoder.swapBuffer(); + } + } + } + } + simpleCameraRender.release(); + releaseSurfaceManager(); + } + + @Override + public SurfaceTexture getSurfaceTexture() { + return simpleCameraRender.getSurfaceTexture(); + } + + @Override + public Surface getSurface() { + return simpleCameraRender.getSurface(); + } + + @Override + public void setFilter(int filterPosition, BaseFilterRender baseFilterRender) { + + } + + @Override + public void setFilter(BaseFilterRender baseFilterRender) { + setFilter(0, baseFilterRender); + } + + @Override + public void enableAA(boolean AAEnabled) { + + } + + @Override + public void setRotation(int rotation) { + simpleCameraRender.setRotation(rotation); + } + + @Override + public boolean isAAEnabled() { + return false; + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OffScreenGlThread.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OffScreenGlThread.java new file mode 100644 index 0000000..c307b4a --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OffScreenGlThread.java @@ -0,0 +1,221 @@ +package com.pedro.rtplibrary.view; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.view.Surface; +import com.pedro.encoder.input.gl.SurfaceManager; +import com.pedro.encoder.input.gl.render.ManagerRender; +import com.pedro.encoder.input.gl.render.filters.BaseFilterRender; +import com.pedro.encoder.input.video.FpsLimiter; +import com.pedro.encoder.utils.gl.GlUtil; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.Semaphore; + +/** + * Created by pedro on 4/03/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class OffScreenGlThread + implements GlInterface, Runnable, SurfaceTexture.OnFrameAvailableListener { + + private final Context context; + private Thread thread = null; + private boolean frameAvailable = false; + private boolean running = true; + private boolean initialized = false; + + private SurfaceManager surfaceManager = null; + private SurfaceManager surfaceManagerEncoder = null; + + private ManagerRender textureManager = null; + + private final Semaphore semaphore = new Semaphore(0); + private final BlockingQueue filterQueue = new LinkedBlockingQueue<>(); + private final Object sync = new Object(); + private int encoderWidth, encoderHeight; + private boolean loadAA = false; + private int streamRotation; + + private boolean AAEnabled = false; + private FpsLimiter fpsLimiter = new FpsLimiter(); + //used with camera + private TakePhotoCallback takePhotoCallback; + + public OffScreenGlThread(Context context) { + this.context = context; + } + + @Override + public void init() { + if (!initialized) textureManager = new ManagerRender(); + textureManager.setCameraFlip(false, false); + initialized = true; + } + + @Override + public void setEncoderSize(int width, int height) { + this.encoderWidth = width; + this.encoderHeight = height; + } + + @Override + public void setFps(int fps) { + fpsLimiter.setFPS(fps); + } + + @Override + public SurfaceTexture getSurfaceTexture() { + return textureManager.getSurfaceTexture(); + } + + @Override + public Surface getSurface() { + return textureManager.getSurface(); + } + + @Override + public void addMediaCodecSurface(Surface surface) { + synchronized (sync) { + surfaceManagerEncoder = new SurfaceManager(surface, surfaceManager); + } + } + + @Override + public void removeMediaCodecSurface() { + synchronized (sync) { + if (surfaceManagerEncoder != null) { + surfaceManagerEncoder.release(); + surfaceManagerEncoder = null; + } + } + } + + @Override + public void takePhoto(TakePhotoCallback takePhotoCallback) { + this.takePhotoCallback = takePhotoCallback; + } + + @Override + public void setFilter(int filterPosition, BaseFilterRender baseFilterRender) { + filterQueue.add(new Filter(filterPosition, baseFilterRender)); + } + + @Override + public void setFilter(BaseFilterRender baseFilterRender) { + setFilter(0, baseFilterRender); + } + + @Override + public void enableAA(boolean AAEnabled) { + this.AAEnabled = AAEnabled; + loadAA = true; + } + + @Override + public void setRotation(int rotation) { + textureManager.setCameraRotation(rotation); + } + + @Override + public void setStreamRotation(int rotation) { + streamRotation = rotation; + } + + @Override + public boolean isAAEnabled() { + return textureManager != null && textureManager.isAAEnabled(); + } + + @Override + public void start() { + synchronized (sync) { + thread = new Thread(this); + running = true; + thread.start(); + semaphore.acquireUninterruptibly(); + } + } + + @Override + public void stop() { + synchronized (sync) { + if (thread != null) { + thread.interrupt(); + try { + thread.join(100); + } catch (InterruptedException e) { + thread.interrupt(); + } + thread = null; + } + running = false; + } + } + + private void releaseSurfaceManager() { + if (surfaceManager != null) { + surfaceManager.release(); + surfaceManager = null; + } + } + + @Override + public void run() { + releaseSurfaceManager(); + surfaceManager = new SurfaceManager(); + surfaceManager.makeCurrent(); + textureManager.initGl(context, encoderWidth, encoderHeight, encoderWidth, encoderHeight); + textureManager.getSurfaceTexture().setOnFrameAvailableListener(this); + semaphore.release(); + try { + while (running) { + if (frameAvailable) { + frameAvailable = false; + surfaceManager.makeCurrent(); + textureManager.updateFrame(); + textureManager.drawOffScreen(); + textureManager.drawScreen(encoderWidth, encoderHeight, false, 0, 0, true); + surfaceManager.swapBuffer(); + + synchronized (sync) { + if (surfaceManagerEncoder != null && !fpsLimiter.limitFPS()) { + surfaceManagerEncoder.makeCurrent(); + textureManager.drawScreen(encoderWidth, encoderHeight, false, 0, streamRotation, + false); + surfaceManagerEncoder.swapBuffer(); + } + if (takePhotoCallback != null) { + takePhotoCallback.onTakePhoto( + GlUtil.getBitmap(encoderWidth, encoderHeight, encoderWidth, encoderHeight)); + takePhotoCallback = null; + } + } + if (!filterQueue.isEmpty()) { + Filter filter = filterQueue.take(); + textureManager.setFilter(filter.getPosition(), filter.getBaseFilterRender()); + } else if (loadAA) { + textureManager.enableAA(AAEnabled); + loadAA = false; + } + } + } + } catch (InterruptedException ignore) { + Thread.currentThread().interrupt(); + } finally { + textureManager.release(); + releaseSurfaceManager(); + } + } + + @Override + public void onFrameAvailable(SurfaceTexture surfaceTexture) { + synchronized (sync) { + frameAvailable = true; + sync.notifyAll(); + } + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlView.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlView.java new file mode 100644 index 0000000..a8740df --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlView.java @@ -0,0 +1,162 @@ +package com.pedro.rtplibrary.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.SurfaceTexture; +import android.os.Build; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Surface; +import android.view.SurfaceHolder; +import androidx.annotation.RequiresApi; +import com.pedro.encoder.input.gl.SurfaceManager; +import com.pedro.encoder.input.gl.render.ManagerRender; +import com.pedro.encoder.input.gl.render.filters.BaseFilterRender; +import com.pedro.encoder.utils.gl.GlUtil; +import com.pedro.rtplibrary.R; + +/** + * Created by pedro on 9/09/17. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public class OpenGlView extends OpenGlViewBase { + + private ManagerRender managerRender = null; + private boolean loadAA = false; + + private boolean AAEnabled = false; + private boolean keepAspectRatio = false; + private int aspectRatioMode = 0; + private boolean isFlipHorizontal = false, isFlipVertical = false; + + public OpenGlView(Context context) { + super(context); + } + + public OpenGlView(Context context, AttributeSet attrs) { + super(context, attrs); + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.OpenGlView); + try { + keepAspectRatio = typedArray.getBoolean(R.styleable.OpenGlView_keepAspectRatio, false); + aspectRatioMode = typedArray.getInt(R.styleable.OpenGlView_aspectRatioMode, 0); + AAEnabled = typedArray.getBoolean(R.styleable.OpenGlView_AAEnabled, false); + ManagerRender.numFilters = typedArray.getInt(R.styleable.OpenGlView_numFilters, 1); + isFlipHorizontal = typedArray.getBoolean(R.styleable.OpenGlView_isFlipHorizontal, false); + isFlipVertical = typedArray.getBoolean(R.styleable.OpenGlView_isFlipVertical, false); + } finally { + typedArray.recycle(); + } + } + + @Override + public void init() { + if (!initialized) managerRender = new ManagerRender(); + managerRender.setCameraFlip(isFlipHorizontal, isFlipVertical); + initialized = true; + } + + @Override + public SurfaceTexture getSurfaceTexture() { + return managerRender.getSurfaceTexture(); + } + + @Override + public Surface getSurface() { + return managerRender.getSurface(); + } + + @Override + public void setFilter(int filterPosition, BaseFilterRender baseFilterRender) { + filterQueue.add(new Filter(filterPosition, baseFilterRender)); + } + + @Override + public void setFilter(BaseFilterRender baseFilterRender) { + setFilter(0, baseFilterRender); + } + + @Override + public void enableAA(boolean AAEnabled) { + this.AAEnabled = AAEnabled; + loadAA = true; + } + + @Override + public void setRotation(int rotation) { + managerRender.setCameraRotation(rotation); + } + + public boolean isKeepAspectRatio() { + return keepAspectRatio; + } + + public void setKeepAspectRatio(boolean keepAspectRatio) { + this.keepAspectRatio = keepAspectRatio; + } + + public void setCameraFlip(boolean isFlipHorizontal, boolean isFlipVertical) { + managerRender.setCameraFlip(isFlipHorizontal, isFlipVertical); + } + + @Override + public boolean isAAEnabled() { + return managerRender != null && managerRender.isAAEnabled(); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + Log.i(TAG, "size: " + width + "x" + height); + this.previewWidth = width; + this.previewHeight = height; + if (managerRender != null) managerRender.setPreviewSize(previewWidth, previewHeight); + } + + @Override + public void run() { + releaseSurfaceManager(); + surfaceManager = new SurfaceManager(getHolder().getSurface()); + surfaceManager.makeCurrent(); + managerRender.initGl(getContext(), encoderWidth, encoderHeight, previewWidth, previewHeight); + managerRender.getSurfaceTexture().setOnFrameAvailableListener(this); + semaphore.release(); + try { + while (running) { + if (frameAvailable) { + frameAvailable = false; + surfaceManager.makeCurrent(); + managerRender.updateFrame(); + managerRender.drawOffScreen(); + managerRender.drawScreen(previewWidth, previewHeight, keepAspectRatio, aspectRatioMode, 0, + true); + surfaceManager.swapBuffer(); + if (takePhotoCallback != null) { + takePhotoCallback.onTakePhoto( + GlUtil.getBitmap(previewWidth, previewHeight, encoderWidth, encoderHeight)); + takePhotoCallback = null; + } + synchronized (sync) { + if (surfaceManagerEncoder != null && !fpsLimiter.limitFPS()) { + surfaceManagerEncoder.makeCurrent(); + managerRender.drawScreen(encoderWidth, encoderHeight, false, aspectRatioMode, + streamRotation, false); + surfaceManagerEncoder.swapBuffer(); + } + } + if (!filterQueue.isEmpty()) { + Filter filter = filterQueue.take(); + managerRender.setFilter(filter.getPosition(), filter.getBaseFilterRender()); + } else if (loadAA) { + managerRender.enableAA(AAEnabled); + loadAA = false; + } + } + } + } catch (InterruptedException ignore) { + Thread.currentThread().interrupt(); + } finally { + managerRender.release(); + releaseSurfaceManager(); + } + } +} \ No newline at end of file diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlViewBase.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlViewBase.java new file mode 100644 index 0000000..7e5fce8 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/OpenGlViewBase.java @@ -0,0 +1,153 @@ +package com.pedro.rtplibrary.view; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.os.Build; +import androidx.annotation.RequiresApi; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import com.pedro.encoder.input.gl.SurfaceManager; +import com.pedro.encoder.input.video.FpsLimiter; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.Semaphore; + +/** + * Created by pedro on 10/03/18. + */ + +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +public abstract class OpenGlViewBase extends SurfaceView + implements GlInterface, Runnable, SurfaceTexture.OnFrameAvailableListener, + SurfaceHolder.Callback { + + public final static String TAG = "OpenGlViewBase"; + + protected Thread thread = null; + protected boolean frameAvailable = false; + protected boolean running = false; + protected boolean initialized = false; + + protected SurfaceManager surfaceManager = null; + protected SurfaceManager surfaceManagerEncoder = null; + + protected FpsLimiter fpsLimiter = new FpsLimiter(); + protected final Semaphore semaphore = new Semaphore(0); + protected final BlockingQueue filterQueue = new LinkedBlockingQueue<>(); + protected final Object sync = new Object(); + protected int previewWidth, previewHeight; + protected int encoderWidth, encoderHeight; + protected TakePhotoCallback takePhotoCallback; + protected int streamRotation; + + public OpenGlViewBase(Context context) { + super(context); + getHolder().addCallback(this); + } + + public OpenGlViewBase(Context context, AttributeSet attrs) { + super(context, attrs); + getHolder().addCallback(this); + } + + @Override + public void setStreamRotation(int streamRotation) { + this.streamRotation = streamRotation; + } + + @Override + public abstract void init(); + + @Override + public abstract SurfaceTexture getSurfaceTexture(); + + @Override + public abstract Surface getSurface(); + + @Override + public void setFps(int fps) { + fpsLimiter.setFPS(fps); + } + + @Override + public void takePhoto(TakePhotoCallback takePhotoCallback) { + this.takePhotoCallback = takePhotoCallback; + } + + @Override + public void addMediaCodecSurface(Surface surface) { + synchronized (sync) { + surfaceManagerEncoder = new SurfaceManager(surface, surfaceManager); + } + } + + @Override + public void removeMediaCodecSurface() { + synchronized (sync) { + if (surfaceManagerEncoder != null) { + surfaceManagerEncoder.release(); + surfaceManagerEncoder = null; + } + } + } + + @Override + public void setEncoderSize(int width, int height) { + this.encoderWidth = width; + this.encoderHeight = height; + } + + @Override + public void start() { + synchronized (sync) { + Log.i(TAG, "Thread started."); + thread = new Thread(this, "glThread"); + running = true; + thread.start(); + semaphore.acquireUninterruptibly(); + } + } + + @Override + public void stop() { + synchronized (sync) { + if (thread != null) { + thread.interrupt(); + try { + thread.join(100); + } catch (InterruptedException e) { + thread.interrupt(); + } + thread = null; + } + running = false; + } + } + + protected void releaseSurfaceManager() { + if (surfaceManager != null) { + surfaceManager.release(); + surfaceManager = null; + } + } + + @Override + public void onFrameAvailable(SurfaceTexture surfaceTexture) { + synchronized (sync) { + frameAvailable = true; + sync.notifyAll(); + } + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + stop(); + } +} diff --git a/rtplibrary/src/main/java/com/pedro/rtplibrary/view/TakePhotoCallback.java b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/TakePhotoCallback.java new file mode 100644 index 0000000..1fd93a4 --- /dev/null +++ b/rtplibrary/src/main/java/com/pedro/rtplibrary/view/TakePhotoCallback.java @@ -0,0 +1,12 @@ +package com.pedro.rtplibrary.view; + +import android.graphics.Bitmap; + +/** + * Created by pedro on 16/07/18. + */ + +public interface TakePhotoCallback { + + void onTakePhoto(Bitmap bitmap); +} diff --git a/rtplibrary/src/main/res/values/attrs.xml b/rtplibrary/src/main/res/values/attrs.xml new file mode 100644 index 0000000..d2c08ad --- /dev/null +++ b/rtplibrary/src/main/res/values/attrs.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rtsp/.gitignore b/rtsp/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/rtsp/.gitignore @@ -0,0 +1 @@ +/build diff --git a/rtsp/build.gradle b/rtsp/build.gradle new file mode 100644 index 0000000..d16f3ec --- /dev/null +++ b/rtsp/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 30 + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 30 + versionCode 182 + versionName "1.8.2" + } + buildTypes { + release { + minifyEnabled false + consumerProguardFiles 'proguard-rules.pro' + } + } +} + +dependencies {} diff --git a/rtsp/proguard-rules.pro b/rtsp/proguard-rules.pro new file mode 100644 index 0000000..3347674 --- /dev/null +++ b/rtsp/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /home/pedro/Android/Sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/rtsp/src/main/AndroidManifest.xml b/rtsp/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7d16cbb --- /dev/null +++ b/rtsp/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtcp/BaseSenderReport.java b/rtsp/src/main/java/com/pedro/rtsp/rtcp/BaseSenderReport.java new file mode 100644 index 0000000..883a3be --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtcp/BaseSenderReport.java @@ -0,0 +1,136 @@ +package com.pedro.rtsp.rtcp; + +import android.util.Log; +import com.pedro.rtsp.rtsp.Protocol; +import com.pedro.rtsp.rtsp.RtpFrame; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Random; + +/** + * Created by pedro on 7/11/18. + */ + +public abstract class BaseSenderReport { + + protected static final String TAG = "BaseSenderReport"; + protected static final int PACKET_LENGTH = 28; + private static final int MTU = 1500; + private final long interval = 3000; + + private final byte[] videoBuffer = new byte[MTU]; + private final byte[] audioBuffer = new byte[MTU]; + + private long videoTime; + private long audioTime; + private int videoPacketCount; + private int videoOctetCount; + private int audioPacketCount; + private int audioOctetCount; + + BaseSenderReport() { + /* Version(2) Padding(0) */ + /* ^ ^ PT = 0 */ + /* | | ^ */ + /* | -------- | */ + /* | |--------------------- */ + /* | || */ + /* | || */ + videoBuffer[0] = (byte) Integer.parseInt("10000000", 2); + audioBuffer[0] = (byte) Integer.parseInt("10000000", 2); + + /* Packet Type PT */ + videoBuffer[1] = (byte) 200; + audioBuffer[1] = (byte) 200; + + /* Byte 2,3 -> Length */ + setLong(videoBuffer, PACKET_LENGTH / 4 - 1, 2, 4); + setLong(audioBuffer, PACKET_LENGTH / 4 - 1, 2, 4); + /* Byte 4,5,6,7 -> SSRC */ + setLong(videoBuffer, new Random().nextInt(), 4, 8); + setLong(audioBuffer, new Random().nextInt(), 4, 8); + /* Byte 8,9,10,11 -> NTP timestamp hb */ + /* Byte 12,13,14,15 -> NTP timestamp lb */ + /* Byte 16,17,18,19 -> RTP timestamp */ + /* Byte 20,21,22,23 -> packet count */ + /* Byte 24,25,26,27 -> octet count */ + } + + public static BaseSenderReport getInstance(Protocol protocol, int videoSourcePort, + int audioSourcePort) { + return protocol == Protocol.TCP ? new SenderReportTcp() + : new SenderReportUdp(videoSourcePort, audioSourcePort); + } + + public abstract void setDataStream(OutputStream outputStream, String host); + + public void update(RtpFrame rtpFrame) { + if (rtpFrame.getChannelIdentifier() == (byte) 2) { + updateVideo(rtpFrame); + } else { + updateAudio(rtpFrame); + } + } + + public abstract void sendReport(byte[] buffer, RtpFrame rtpFrame, String type, int packetCount, + int octetCount) throws IOException; + + private void updateVideo(RtpFrame rtpFrame) { + videoPacketCount++; + videoOctetCount += rtpFrame.getLength(); + setLong(videoBuffer, videoPacketCount, 20, 24); + setLong(videoBuffer, videoOctetCount, 24, 28); + if (System.currentTimeMillis() - videoTime >= interval) { + videoTime = System.currentTimeMillis(); + setData(videoBuffer, System.nanoTime(), rtpFrame.getTimeStamp()); + try { + sendReport(videoBuffer, rtpFrame, "Video", videoPacketCount, videoOctetCount); + } catch (IOException e) { + Log.e(TAG, "Error", e); + } + } + } + + private void updateAudio(RtpFrame rtpFrame) { + audioPacketCount++; + audioOctetCount += rtpFrame.getLength(); + setLong(audioBuffer, audioPacketCount, 20, 24); + setLong(audioBuffer, audioOctetCount, 24, 28); + if (System.currentTimeMillis() - audioTime >= interval) { + audioTime = System.currentTimeMillis(); + setData(audioBuffer, System.nanoTime(), rtpFrame.getTimeStamp()); + try { + sendReport(audioBuffer, rtpFrame, "Audio", audioPacketCount, audioOctetCount); + } catch (IOException e) { + Log.e(TAG, "Error", e); + } + } + } + + public void reset() { + videoPacketCount = videoOctetCount = 0; + audioPacketCount = audioOctetCount = 0; + videoTime = audioTime = 0; + setLong(videoBuffer, videoPacketCount, 20, 24); + setLong(videoBuffer, videoOctetCount, 24, 28); + setLong(audioBuffer, audioPacketCount, 20, 24); + setLong(audioBuffer, audioOctetCount, 24, 28); + } + + public abstract void close(); + + private void setLong(byte[] buffer, long n, int begin, int end) { + for (end--; end >= begin; end--) { + buffer[end] = (byte) (n % 256); + n >>= 8; + } + } + + private void setData(byte[] buffer, long ntpts, long rtpts) { + long hb = ntpts / 1000000000; + long lb = ((ntpts - hb * 1000000000) * 4294967296L) / 1000000000; + setLong(buffer, hb, 8, 12); + setLong(buffer, lb, 12, 16); + setLong(buffer, rtpts, 16, 20); + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtcp/SenderReportTcp.java b/rtsp/src/main/java/com/pedro/rtsp/rtcp/SenderReportTcp.java new file mode 100644 index 0000000..036011b --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtcp/SenderReportTcp.java @@ -0,0 +1,48 @@ +package com.pedro.rtsp.rtcp; + +import android.util.Log; +import com.pedro.rtsp.rtsp.RtpFrame; +import java.io.IOException; +import java.io.OutputStream; + +/** + * Created by pedro on 8/11/18. + */ + +public class SenderReportTcp extends BaseSenderReport { + + private OutputStream outputStream; + private byte tcpHeader[]; + + public SenderReportTcp() { + super(); + tcpHeader = new byte[] { '$', 0, 0, PACKET_LENGTH }; + } + + @Override + public void setDataStream(OutputStream outputStream, String host) { + this.outputStream = outputStream; + } + + @Override + public void sendReport(byte[] buffer, RtpFrame rtpFrame, String type, int packetCount, + int octetCount) throws IOException { + sendReportTCP(buffer, rtpFrame.getChannelIdentifier(), type, packetCount, octetCount); + } + + @Override + public void close() { + + } + + private void sendReportTCP(byte[] buffer, byte channelIdentifier, String type, int packet, + int octet) throws IOException { + synchronized (outputStream) { + tcpHeader[1] = (byte) (channelIdentifier + 1); + outputStream.write(tcpHeader); + outputStream.write(buffer, 0, PACKET_LENGTH); + outputStream.flush(); + Log.i(TAG, "wrote report: " + type + ", packets: " + packet + ", octet: " + octet); + } + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtcp/SenderReportUdp.java b/rtsp/src/main/java/com/pedro/rtsp/rtcp/SenderReportUdp.java new file mode 100644 index 0000000..7a062d8 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtcp/SenderReportUdp.java @@ -0,0 +1,67 @@ +package com.pedro.rtsp.rtcp; + +import android.util.Log; +import com.pedro.rtsp.rtsp.RtpFrame; +import java.io.IOException; +import java.io.OutputStream; +import java.net.DatagramPacket; +import java.net.InetAddress; +import java.net.MulticastSocket; +import java.net.UnknownHostException; + +/** + * Created by pedro on 8/11/18. + */ + +public class SenderReportUdp extends BaseSenderReport { + + private MulticastSocket multicastSocketVideo; + private MulticastSocket multicastSocketAudio; + private DatagramPacket datagramPacket = new DatagramPacket(new byte[] { 0 }, 1); + + public SenderReportUdp(int videoSourcePort, int audioSourcePort) { + super(); + try { + multicastSocketVideo = new MulticastSocket(videoSourcePort); + multicastSocketVideo.setTimeToLive(64); + multicastSocketAudio = new MulticastSocket(audioSourcePort); + multicastSocketAudio.setTimeToLive(64); + } catch (IOException e) { + Log.e(TAG, "Error", e); + } + } + + @Override + public void setDataStream(OutputStream outputStream, String host) { + try { + datagramPacket.setAddress(InetAddress.getByName(host)); + } catch (UnknownHostException e) { + Log.e(TAG, "Error", e); + } + } + + @Override + public void sendReport(byte[] buffer, RtpFrame rtpFrame, String type, int packetCount, + int octetCount) throws IOException { + sendReportUDP(buffer, rtpFrame.getRtcpPort(), type, packetCount, octetCount); + } + + @Override + public void close() { + multicastSocketVideo.close(); + multicastSocketAudio.close(); + } + + private void sendReportUDP(byte[] buffer, int port, String type, int packet, int octet) + throws IOException { + datagramPacket.setData(buffer); + datagramPacket.setPort(port); + datagramPacket.setLength(PACKET_LENGTH); + if (type.equals("Video")) { + multicastSocketVideo.send(datagramPacket); + } else { + multicastSocketAudio.send(datagramPacket); + } + Log.i(TAG, "wrote report: " + type + ", port: " + port + ", packets: " + packet + ", octet: " + octet); + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/AacPacket.java b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/AacPacket.java new file mode 100644 index 0000000..1bce52b --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/AacPacket.java @@ -0,0 +1,55 @@ +package com.pedro.rtsp.rtp.packets; + +import android.media.MediaCodec; +import com.pedro.rtsp.rtsp.RtpFrame; +import com.pedro.rtsp.utils.RtpConstants; +import java.nio.ByteBuffer; + +/** + * Created by pedro on 27/11/18. + * + * RFC 3640. + */ +public class AacPacket extends BasePacket { + + private AudioPacketCallback audioPacketCallback; + + public AacPacket(int sampleRate, AudioPacketCallback audioPacketCallback) { + super(sampleRate); + this.audioPacketCallback = audioPacketCallback; + channelIdentifier = (byte) 0; + } + + @Override + public void createAndSendPacket(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) { + int length = bufferInfo.size - byteBuffer.position(); + if (length > 0) { + byte[] buffer = getBuffer(length + RtpConstants.RTP_HEADER_LENGTH + 4); + + byteBuffer.get(buffer, RtpConstants.RTP_HEADER_LENGTH + 4, length); + long ts = bufferInfo.presentationTimeUs * 1000; + markPacket(buffer); + updateTimeStamp(buffer, ts); + + // AU-headers-length field: contains the size in bits of a AU-header + // 13+3 = 16 bits -> 13bits for AU-size and 3bits for AU-Index / AU-Index-delta + // 13 bits will be enough because ADTS uses 13 bits for frame length + buffer[RtpConstants.RTP_HEADER_LENGTH] = (byte) 0; + buffer[RtpConstants.RTP_HEADER_LENGTH + 1] = (byte) 0x10; + + // AU-size + buffer[RtpConstants.RTP_HEADER_LENGTH + 2] = (byte) (length >> 5); + buffer[RtpConstants.RTP_HEADER_LENGTH + 3] = (byte) (length << 3); + + // AU-Index + buffer[RtpConstants.RTP_HEADER_LENGTH + 3] &= 0xF8; + buffer[RtpConstants.RTP_HEADER_LENGTH + 3] |= 0x00; + + updateSeq(buffer); + RtpFrame rtpFrame = + new RtpFrame(buffer, ts, RtpConstants.RTP_HEADER_LENGTH + length + 4, rtpPort, rtcpPort, + channelIdentifier); + audioPacketCallback.onAudioFrameCreated(rtpFrame); + } + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/AudioPacketCallback.java b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/AudioPacketCallback.java new file mode 100644 index 0000000..956887b --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/AudioPacketCallback.java @@ -0,0 +1,11 @@ +package com.pedro.rtsp.rtp.packets; + +import com.pedro.rtsp.rtsp.RtpFrame; + +/** + * Created by pedro on 7/11/18. + */ + +public interface AudioPacketCallback { + void onAudioFrameCreated(RtpFrame rtpFrame); +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/BasePacket.java b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/BasePacket.java new file mode 100644 index 0000000..fe5ea3b --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/BasePacket.java @@ -0,0 +1,75 @@ +package com.pedro.rtsp.rtp.packets; + +import android.media.MediaCodec; +import com.pedro.rtsp.utils.RtpConstants; +import java.nio.ByteBuffer; +import java.util.Random; + +/** + * Created by pedro on 27/11/18. + */ + +public abstract class BasePacket { + + protected final static int maxPacketSize = RtpConstants.MTU - 28; + protected byte channelIdentifier; + protected int rtpPort; + protected int rtcpPort; + private final long clock; + private int seq = 0; + private int ssrc; + + public BasePacket(long clock) { + this.clock = clock; + ssrc = new Random().nextInt(); + } + + public abstract void createAndSendPacket(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo); + + public void setPorts(int rtpPort, int rtcpPort) { + this.rtpPort = rtpPort; + this.rtcpPort = rtcpPort; + } + + public void reset() { + seq = 0; + ssrc = new Random().nextInt(); + } + + protected byte[] getBuffer(int size) { + byte[] buffer = new byte[size]; + buffer[0] = (byte) Integer.parseInt("10000000", 2); + buffer[1] = (byte) RtpConstants.payloadType; + setLongSSRC(buffer, ssrc); + requestBuffer(buffer); + return buffer; + } + + protected void updateTimeStamp(byte[] buffer, long timestamp) { + long ts = timestamp * clock / 1000000000L; + setLong(buffer, ts, 4, 8); + } + + protected void setLong(byte[] buffer, long n, int begin, int end) { + for (end--; end >= begin; end--) { + buffer[end] = (byte) (n % 256); + n >>= 8; + } + } + + protected void updateSeq(byte[] buffer) { + setLong(buffer, ++seq, 2, 4); + } + + protected void markPacket(byte[] buffer) { + buffer[1] |= 0x80; + } + + private void setLongSSRC(byte[] buffer, int ssrc) { + setLong(buffer, ssrc, 8, 12); + } + + private void requestBuffer(byte[] buffer) { + buffer[1] &= 0x7F; + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/H264Packet.java b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/H264Packet.java new file mode 100644 index 0000000..91ee8af --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/H264Packet.java @@ -0,0 +1,134 @@ +package com.pedro.rtsp.rtp.packets; + +import android.media.MediaCodec; +import com.pedro.rtsp.rtsp.RtpFrame; +import com.pedro.rtsp.utils.RtpConstants; +import java.nio.ByteBuffer; + +/** + * Created by pedro on 27/11/18. + * + * RFC 3984 + */ +public class H264Packet extends BasePacket { + + private byte[] header = new byte[5]; + private byte[] stapA; + private VideoPacketCallback videoPacketCallback; + private boolean sendKeyFrame = false; + + public H264Packet(byte[] sps, byte[] pps, VideoPacketCallback videoPacketCallback) { + super(RtpConstants.clockVideoFrequency); + this.videoPacketCallback = videoPacketCallback; + channelIdentifier = (byte) 2; + setSpsPps(sps, pps); + } + + @Override + public void createAndSendPacket(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) { + // We read a NAL units from ByteBuffer and we send them + // NAL units are preceded with 0x00000001 + byteBuffer.rewind(); + byteBuffer.get(header, 0, 5); + long ts = bufferInfo.presentationTimeUs * 1000L; + int naluLength = bufferInfo.size - byteBuffer.position() + 1; + int type = header[4] & 0x1F; + if (type == RtpConstants.IDR || bufferInfo.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME) { + byte[] buffer = getBuffer(stapA.length + RtpConstants.RTP_HEADER_LENGTH); + updateTimeStamp(buffer, ts); + + markPacket(buffer); //mark end frame + System.arraycopy(stapA, 0, buffer, RtpConstants.RTP_HEADER_LENGTH, stapA.length); + + updateSeq(buffer); + RtpFrame rtpFrame = + new RtpFrame(buffer, ts, stapA.length + RtpConstants.RTP_HEADER_LENGTH, rtpPort, rtcpPort, + channelIdentifier); + videoPacketCallback.onVideoFrameCreated(rtpFrame); + sendKeyFrame = true; + } + if (sendKeyFrame) { + // Small NAL unit => Single NAL unit + if (naluLength <= maxPacketSize - RtpConstants.RTP_HEADER_LENGTH - 2) { + int cont = naluLength - 1; + int length = cont < bufferInfo.size - byteBuffer.position() ? cont : bufferInfo.size - byteBuffer.position(); + byte[] buffer = getBuffer(length + RtpConstants.RTP_HEADER_LENGTH + 1); + + buffer[RtpConstants.RTP_HEADER_LENGTH] = header[4]; + byteBuffer.get(buffer, RtpConstants.RTP_HEADER_LENGTH + 1, length); + + updateTimeStamp(buffer, ts); + markPacket(buffer); //mark end frame + + updateSeq(buffer); + RtpFrame rtpFrame = + new RtpFrame(buffer, ts, naluLength + RtpConstants.RTP_HEADER_LENGTH, rtpPort, rtcpPort, + channelIdentifier); + videoPacketCallback.onVideoFrameCreated(rtpFrame); + } + // Large NAL unit => Split nal unit + else { + // Set FU-A header + header[1] = (byte) (header[4] & 0x1F); // FU header type + header[1] += 0x80; // set start bit to 1 + // Set FU-A indicator + header[0] = (byte) ((header[4] & 0x60) & 0xFF); // FU indicator NRI + header[0] += 28; + + int sum = 1; + while (sum < naluLength) { + int cont = naluLength - sum > maxPacketSize - RtpConstants.RTP_HEADER_LENGTH - 2 ? + maxPacketSize + - RtpConstants.RTP_HEADER_LENGTH + - 2 : naluLength - sum; + int length = cont < bufferInfo.size - byteBuffer.position() ? cont : bufferInfo.size - byteBuffer.position(); + byte[] buffer = getBuffer(length + RtpConstants.RTP_HEADER_LENGTH + 2); + + buffer[RtpConstants.RTP_HEADER_LENGTH] = header[0]; + buffer[RtpConstants.RTP_HEADER_LENGTH + 1] = header[1]; + updateTimeStamp(buffer, ts); + byteBuffer.get(buffer, RtpConstants.RTP_HEADER_LENGTH + 2, length); + sum += length; + // Last packet before next NAL + if (sum >= naluLength) { + // End bit on + buffer[RtpConstants.RTP_HEADER_LENGTH + 1] += 0x40; + markPacket(buffer); //mark end frame + } + updateSeq(buffer); + RtpFrame rtpFrame = + new RtpFrame(buffer, ts, length + RtpConstants.RTP_HEADER_LENGTH + 2, rtpPort, + rtcpPort, channelIdentifier); + videoPacketCallback.onVideoFrameCreated(rtpFrame); + // Switch start bit + header[1] = (byte) (header[1] & 0x7F); + } + } + } + } + + private void setSpsPps(byte[] sps, byte[] pps) { + stapA = new byte[sps.length + pps.length + 5]; + + // STAP-A NAL header is 24 + stapA[0] = 24; + + // Write NALU 1 size into the array (NALU 1 is the SPS). + stapA[1] = (byte) (sps.length >> 8); + stapA[2] = (byte) (sps.length & 0xFF); + + // Write NALU 2 size into the array (NALU 2 is the PPS). + stapA[sps.length + 3] = (byte) (pps.length >> 8); + stapA[sps.length + 4] = (byte) (pps.length & 0xFF); + + // Write NALU 1 into the array, then write NALU 2 into the array. + System.arraycopy(sps, 0, stapA, 3, sps.length); + System.arraycopy(pps, 0, stapA, 5 + sps.length, pps.length); + } + + @Override + public void reset() { + super.reset(); + sendKeyFrame = false; + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/H265Packet.java b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/H265Packet.java new file mode 100644 index 0000000..afe4d25 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/H265Packet.java @@ -0,0 +1,142 @@ +package com.pedro.rtsp.rtp.packets; + +import android.media.MediaCodec; +import com.pedro.rtsp.rtsp.RtpFrame; +import com.pedro.rtsp.utils.RtpConstants; +import java.nio.ByteBuffer; + +/** + * Created by pedro on 28/11/18. + * + * RFC 7798. + */ +public class H265Packet extends BasePacket { + + private byte[] header = new byte[6]; + private byte[] stapA; + private VideoPacketCallback videoPacketCallback; + private boolean sendKeyFrame = false; + + public H265Packet(byte[] sps, byte[] pps, byte[] vps, VideoPacketCallback videoPacketCallback) { + super(RtpConstants.clockVideoFrequency); + this.videoPacketCallback = videoPacketCallback; + channelIdentifier = (byte) 2; + setSpsPpsVps(sps, pps, vps); + } + + @Override + public void createAndSendPacket(ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) { + // We read a NAL units from ByteBuffer and we send them + // NAL units are preceded with 0x00000001 + byteBuffer.rewind(); + byteBuffer.get(header, 0, 6); + long ts = bufferInfo.presentationTimeUs * 1000L; + int naluLength = bufferInfo.size - byteBuffer.position() + 1; + int type = (header[4] >> 1) & 0x3f; + if (type == RtpConstants.IDR_N_LP || type == RtpConstants.IDR_W_DLP + || bufferInfo.flags == MediaCodec.BUFFER_FLAG_KEY_FRAME) { + byte[] buffer = getBuffer(stapA.length + RtpConstants.RTP_HEADER_LENGTH); + updateTimeStamp(buffer, ts); + + markPacket(buffer); //mark end frame + System.arraycopy(stapA, 0, buffer, RtpConstants.RTP_HEADER_LENGTH, stapA.length); + + updateSeq(buffer); + RtpFrame rtpFrame = + new RtpFrame(buffer, ts, stapA.length + RtpConstants.RTP_HEADER_LENGTH, rtpPort, rtcpPort, + channelIdentifier); + videoPacketCallback.onVideoFrameCreated(rtpFrame); + sendKeyFrame = true; + } + if (sendKeyFrame) { + // Small NAL unit => Single NAL unit + if (naluLength <= maxPacketSize - RtpConstants.RTP_HEADER_LENGTH - 3) { + int cont = naluLength - 1; + int length = cont < bufferInfo.size - byteBuffer.position() ? cont : bufferInfo.size - byteBuffer.position(); + byte[] buffer = getBuffer(length + RtpConstants.RTP_HEADER_LENGTH + 2); + //Set PayloadHdr (exact copy of nal unit header) + buffer[RtpConstants.RTP_HEADER_LENGTH] = header[4]; + buffer[RtpConstants.RTP_HEADER_LENGTH + 1] = header[5]; + byteBuffer.get(buffer, RtpConstants.RTP_HEADER_LENGTH + 2, length); + + updateTimeStamp(buffer, ts); + markPacket(buffer); //mark end frame + + updateSeq(buffer); + RtpFrame rtpFrame = + new RtpFrame(buffer, ts, naluLength + RtpConstants.RTP_HEADER_LENGTH, rtpPort, rtcpPort, + channelIdentifier); + videoPacketCallback.onVideoFrameCreated(rtpFrame); + } + // Large NAL unit => Split nal unit + else { + //Set PayloadHdr (16bit type=49) + header[0] = 49 << 1; + header[1] = 1; + // Set FU header + // +---------------+ + // |0|1|2|3|4|5|6|7| + // +-+-+-+-+-+-+-+-+ + // |S|E| FuType | + // +---------------+ + header[2] = (byte) type; // FU header type + header[2] += 0x80; // Start bit + + int sum = 1; + while (sum < naluLength) { + int cont = naluLength - sum > maxPacketSize - RtpConstants.RTP_HEADER_LENGTH - 3 ? + maxPacketSize + - RtpConstants.RTP_HEADER_LENGTH + - 3 : naluLength - sum; + int length = cont < bufferInfo.size - byteBuffer.position() ? cont : bufferInfo.size - byteBuffer.position(); + byte[] buffer = getBuffer(length + RtpConstants.RTP_HEADER_LENGTH + 3); + + buffer[RtpConstants.RTP_HEADER_LENGTH] = header[0]; + buffer[RtpConstants.RTP_HEADER_LENGTH + 1] = header[1]; + buffer[RtpConstants.RTP_HEADER_LENGTH + 2] = header[2]; + updateTimeStamp(buffer, ts); + byteBuffer.get(buffer, RtpConstants.RTP_HEADER_LENGTH + 3, length); + sum += length; + // Last packet before next NAL + if (sum >= naluLength) { + // End bit on + buffer[RtpConstants.RTP_HEADER_LENGTH + 2] += 0x40; + markPacket(buffer); //mark end frame + } + updateSeq(buffer); + RtpFrame rtpFrame = + new RtpFrame(buffer, ts, length + RtpConstants.RTP_HEADER_LENGTH + 3, rtpPort, + rtcpPort, channelIdentifier); + videoPacketCallback.onVideoFrameCreated(rtpFrame); + // Switch start bit + header[2] = (byte) (header[2] & 0x7F); + } + } + } + } + + private void setSpsPpsVps(byte[] sps, byte[] pps, byte[] vps) { + stapA = new byte[sps.length + pps.length + 6]; + + stapA[0] = 48 << 1; + stapA[1] = 1; + + // Write NALU 1 size into the array (NALU 1 is the SPS). + stapA[2] = (byte) (sps.length >> 8); + stapA[3] = (byte) (sps.length & 0xFF); + + // Write NALU 2 size into the array (NALU 2 is the PPS). + stapA[sps.length + 4] = (byte) (pps.length >> 8); + stapA[sps.length + 5] = (byte) (pps.length & 0xFF); + + // Write NALU 1 into the array, then write NALU 2 into the array. + System.arraycopy(sps, 0, stapA, 4, sps.length); + System.arraycopy(pps, 0, stapA, 6 + sps.length, pps.length); + } + + @Override + public void reset() { + super.reset(); + sendKeyFrame = false; + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/VideoPacketCallback.java b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/VideoPacketCallback.java new file mode 100644 index 0000000..54abc89 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtp/packets/VideoPacketCallback.java @@ -0,0 +1,11 @@ +package com.pedro.rtsp.rtp.packets; + +import com.pedro.rtsp.rtsp.RtpFrame; + +/** + * Created by pedro on 7/11/18. + */ + +public interface VideoPacketCallback { + void onVideoFrameCreated(RtpFrame rtpFrame); +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtp/sockets/BaseRtpSocket.java b/rtsp/src/main/java/com/pedro/rtsp/rtp/sockets/BaseRtpSocket.java new file mode 100644 index 0000000..5c6e8d7 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtp/sockets/BaseRtpSocket.java @@ -0,0 +1,27 @@ +package com.pedro.rtsp.rtp.sockets; + +import com.pedro.rtsp.rtsp.Protocol; +import com.pedro.rtsp.rtsp.RtpFrame; +import java.io.IOException; +import java.io.OutputStream; + +/** + * Created by pedro on 7/11/18. + */ + +public abstract class BaseRtpSocket { + + protected final static String TAG = "BaseRtpSocket"; + + public static BaseRtpSocket getInstance(Protocol protocol, int videoSourcePort, + int audioSourcePort) { + return protocol == Protocol.TCP ? new RtpSocketTcp() + : new RtpSocketUdp(videoSourcePort, audioSourcePort); + } + + public abstract void setDataStream(OutputStream outputStream, String host); + + public abstract void sendFrame(RtpFrame rtpFrame) throws IOException; + + public abstract void close(); +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketTcp.java b/rtsp/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketTcp.java new file mode 100644 index 0000000..183b908 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketTcp.java @@ -0,0 +1,51 @@ +package com.pedro.rtsp.rtp.sockets; + +import android.util.Log; +import com.pedro.rtsp.rtsp.RtpFrame; +import java.io.IOException; +import java.io.OutputStream; + +/** + * Created by pedro on 7/11/18. + */ + +public class RtpSocketTcp extends BaseRtpSocket { + + private OutputStream outputStream; + private byte tcpHeader[]; + + public RtpSocketTcp() { + tcpHeader = new byte[] { '$', 0, 0, 0 }; + } + + @Override + public void setDataStream(OutputStream outputStream, String host) { + this.outputStream = outputStream; + } + + @Override + public void sendFrame(RtpFrame rtpFrame) throws IOException { + sendFrameTCP(rtpFrame); + } + + @Override + public void close() { + + } + + private void sendFrameTCP(RtpFrame rtpFrame) throws IOException { + synchronized (outputStream) { + int len = rtpFrame.getLength(); + tcpHeader[1] = rtpFrame.getChannelIdentifier(); + tcpHeader[2] = (byte) (len >> 8); + tcpHeader[3] = (byte) (len & 0xFF); + outputStream.write(tcpHeader); + outputStream.write(rtpFrame.getBuffer(), 0, len); + outputStream.flush(); + Log.i(TAG, "wrote packet: " + + (rtpFrame.getChannelIdentifier() == (byte) 2 ? "Video" : "Audio") + + ", size: " + + rtpFrame.getLength()); + } + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketUdp.java b/rtsp/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketUdp.java new file mode 100644 index 0000000..d07f788 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtp/sockets/RtpSocketUdp.java @@ -0,0 +1,69 @@ +package com.pedro.rtsp.rtp.sockets; + +import android.util.Log; +import com.pedro.rtsp.rtsp.RtpFrame; +import java.io.IOException; +import java.io.OutputStream; +import java.net.DatagramPacket; +import java.net.InetAddress; +import java.net.MulticastSocket; +import java.net.UnknownHostException; + +/** + * Created by pedro on 7/11/18. + */ + +public class RtpSocketUdp extends BaseRtpSocket { + + private MulticastSocket multicastSocketVideo; + private MulticastSocket multicastSocketAudio; + private DatagramPacket datagramPacket = new DatagramPacket(new byte[] { 0 }, 1); + + public RtpSocketUdp(int videoSourcePort, int audioSourcePort) { + try { + multicastSocketVideo = new MulticastSocket(videoSourcePort); + multicastSocketVideo.setTimeToLive(64); + multicastSocketAudio = new MulticastSocket(audioSourcePort); + multicastSocketAudio.setTimeToLive(64); + } catch (IOException e) { + Log.e(TAG, "Error", e); + } + } + + @Override + public void setDataStream(OutputStream outputStream, String host) { + try { + datagramPacket.setAddress(InetAddress.getByName(host)); + } catch (UnknownHostException e) { + Log.e(TAG, "Error", e); + } + } + + @Override + public void sendFrame(RtpFrame rtpFrame) throws IOException { + sendFrameUDP(rtpFrame); + } + + @Override + public void close() { + multicastSocketVideo.close(); + multicastSocketAudio.close(); + } + + private void sendFrameUDP(RtpFrame rtpFrame) throws IOException { + datagramPacket.setData(rtpFrame.getBuffer()); + datagramPacket.setPort(rtpFrame.getRtpPort()); + datagramPacket.setLength(rtpFrame.getLength()); + if (rtpFrame.getChannelIdentifier() == (byte) 2) { + multicastSocketVideo.send(datagramPacket); + } else { + multicastSocketAudio.send(datagramPacket); + } + Log.i(TAG, "wrote packet: " + + (rtpFrame.getChannelIdentifier() == (byte) 2 ? "Video" : "Audio") + + ", size: " + + rtpFrame.getLength() + + ", port: " + + rtpFrame.getRtpPort()); + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtsp/Body.java b/rtsp/src/main/java/com/pedro/rtsp/rtsp/Body.java new file mode 100644 index 0000000..0e22f15 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtsp/Body.java @@ -0,0 +1,104 @@ +package com.pedro.rtsp.rtsp; + +import com.pedro.rtsp.utils.RtpConstants; + +/** + * Created by pedro on 21/02/17. + */ + +public class Body { + + /** supported sampleRates. **/ + private static final int[] AUDIO_SAMPLING_RATES = { + 96000, // 0 + 88200, // 1 + 64000, // 2 + 48000, // 3 + 44100, // 4 + 32000, // 5 + 24000, // 6 + 22050, // 7 + 16000, // 8 + 12000, // 9 + 11025, // 10 + 8000, // 11 + 7350, // 12 + -1, // 13 + -1, // 14 + -1, // 15 + }; + + public static String createAacBody(int trackAudio, int sampleRate, boolean isStereo) { + int sampleRateNum = -1; + for (int i = 0; i < AUDIO_SAMPLING_RATES.length; i++) { + if (AUDIO_SAMPLING_RATES[i] == sampleRate) { + sampleRateNum = i; + break; + } + } + int channel = (isStereo) ? 2 : 1; + int config = (2 & 0x1F) << 11 | (sampleRateNum & 0x0F) << 7 | (channel & 0x0F) << 3; + return "m=audio 0 RTP/AVP " + + RtpConstants.payloadType + + "\r\n" + + "a=rtpmap:" + + RtpConstants.payloadType + + " MPEG4-GENERIC/" + + sampleRate + + "/" + + channel + + "\r\n" + + "a=fmtp:" + + RtpConstants.payloadType + + " streamtype=5; profile-level-id=15; mode=AAC-hbr; config=" + + Integer.toHexString(config) + + "; SizeLength=13; IndexLength=3; IndexDeltaLength=3;\r\n" + + "a=control:trackID=" + + trackAudio + + "\r\n"; + } + + public static String createH264Body(int trackVideo, String sps, String pps) { + return "m=video 0 RTP/AVP " + + RtpConstants.payloadType + + "\r\n" + + "a=rtpmap:" + + RtpConstants.payloadType + + " H264/" + + RtpConstants.clockVideoFrequency + + "\r\n" + + "a=fmtp:" + + RtpConstants.payloadType + + " packetization-mode=1;sprop-parameter-sets=" + + sps + + "," + + pps + + ";\r\n" + + "a=control:trackID=" + + trackVideo + + "\r\n"; + } + + public static String createH265Body(int trackVideo, String sps, String pps, String vps) { + return "m=video 0 RTP/AVP " + + RtpConstants.payloadType + + "\r\n" + + "a=rtpmap:" + + RtpConstants.payloadType + + " H265/" + + RtpConstants.clockVideoFrequency + + "\r\n" + + "a=fmtp:" + + RtpConstants.payloadType + + " sprop-sps=" + + sps + + "; sprop-pps=" + + pps + + "; sprop-vps=" + + vps + + ";\r\n" + + "a=control:trackID=" + + trackVideo + + "\r\n"; + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtsp/CommandsManager.java b/rtsp/src/main/java/com/pedro/rtsp/rtsp/CommandsManager.java new file mode 100644 index 0000000..7e4045e --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtsp/CommandsManager.java @@ -0,0 +1,435 @@ +package com.pedro.rtsp.rtsp; + +import android.util.Base64; +import android.util.Log; +import com.pedro.rtsp.utils.AuthUtil; +import com.pedro.rtsp.utils.ConnectCheckerRtsp; +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by pedro on 12/02/19. + * + * Class to create request to server and parse response from server. + */ + +public class CommandsManager { + + private static final String TAG = "CommandsManager"; + private static String authorization = null; + private String host; + private int port; + private String path; + private byte[] sps; + private byte[] pps; + private int cSeq = 0; + private String sessionId; + private long timeStamp; + private int sampleRate = 32000; + private boolean isStereo = true; + private int trackAudio = 0; + private int trackVideo = 1; + private Protocol protocol; + private boolean isOnlyAudio; + + //For udp + private final int[] audioClientPorts = new int[] { 5000, 5001 }; + private final int[] videoClientPorts = new int[] { 5002, 5003 }; + private int[] audioServerPorts = new int[] { 5004, 5005 }; + private int[] videoServerPorts = new int[] { 5006, 5007 }; + private byte[] vps; //For H265 + //For auth + private String user; + private String password; + + public CommandsManager() { + protocol = Protocol.TCP; + long uptime = System.currentTimeMillis(); + timeStamp = (uptime / 1000) << 32 & (((uptime - ((uptime / 1000) * 1000)) >> 32) + / 1000); // NTP timestamp + } + + private byte[] getData(ByteBuffer byteBuffer) { + if (byteBuffer != null) { + byte[] bytes = new byte[byteBuffer.capacity() - 4]; + byteBuffer.position(4); + byteBuffer.get(bytes, 0, bytes.length); + return bytes; + } else { + return null; + } + } + + private String encodeToString(byte[] bytes) { + return Base64.encodeToString(bytes, 0, bytes.length, Base64.NO_WRAP); + } + + public boolean isOnlyAudio() { + return isOnlyAudio; + } + + public void setOnlyAudio(boolean onlyAudio) { + isOnlyAudio = onlyAudio; + } + + public void setVideoInfo(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + this.sps = getData(sps); + this.pps = getData(pps); + this.vps = getData(vps); //H264 has no vps so if not null assume H265 + } + + public void setSampleRate(int sampleRate) { + this.sampleRate = sampleRate; + } + + public void setIsStereo(boolean isStereo) { + this.isStereo = isStereo; + } + + public void setAuth(String user, String password) { + this.user = user; + this.password = password; + } + + public void setUrl(String host, int port, String path) { + this.host = host; + this.port = port; + this.path = path; + } + + public void setProtocol(Protocol protocol) { + this.protocol = protocol; + } + + public String getHost() { + return host; + } + + public int getPort() { + return port; + } + + public String getPath() { + return path; + } + + public byte[] getSps() { + return sps; + } + + public byte[] getPps() { + return pps; + } + + public int getSampleRate() { + return sampleRate; + } + + public boolean isStereo() { + return isStereo; + } + + public int getTrackAudio() { + return trackAudio; + } + + public int getTrackVideo() { + return trackVideo; + } + + public Protocol getProtocol() { + return protocol; + } + + public int[] getAudioClientPorts() { + return audioClientPorts; + } + + public int[] getVideoClientPorts() { + return videoClientPorts; + } + + public byte[] getVps() { + return vps; + } + + public String getUser() { + return user; + } + + public String getPassword() { + return password; + } + + public int[] getAudioServerPorts() { + return audioServerPorts; + } + + public int[] getVideoServerPorts() { + return videoServerPorts; + } + + public void clear() { + sps = null; + pps = null; + vps = null; + retryClear(); + } + + public void retryClear() { + cSeq = 0; + sessionId = null; + } + + private String getSpsString() { + return encodeToString(sps); + } + + private String getPpsString() { + return encodeToString(pps); + } + + private String getVpsString() { + return encodeToString(vps); + } + + private String addHeaders() { + return "CSeq: " + (++cSeq) + "\r\n" + (sessionId != null ? "Session: " + sessionId + "\r\n" + : "") + (authorization != null ? "Authorization: " + authorization + "\r\n" : "") + "\r\n"; + } + + private String createBody() { + String videoBody = ""; + if (!isOnlyAudio) { + videoBody = vps == null ? Body.createH264Body(trackVideo, getSpsString(), getPpsString()) + : Body.createH265Body(trackVideo, getSpsString(), getPpsString(), getVpsString()); + } + return "v=0\r\n" + + "o=- " + + timeStamp + + " " + + timeStamp + + " IN IP4 " + + "127.0.0.1" + + "\r\n" + + "s=Unnamed\r\n" + + "i=N/A\r\n" + + "c=IN IP4 " + + host + + "\r\n" + + "t=0 0\r\n" + + "a=recvonly\r\n" + + videoBody + + Body.createAacBody(trackAudio, sampleRate, isStereo); + } + + private String createAuth(String authResponse) { + Pattern authPattern = + Pattern.compile("realm=\"(.+)\",\\s+nonce=\"(\\w+)\"", Pattern.CASE_INSENSITIVE); + Matcher matcher = authPattern.matcher(authResponse); + //digest auth + if (matcher.find()) { + Log.i(TAG, "using digest auth"); + String realm = matcher.group(1); + String nonce = matcher.group(2); + String hash1 = AuthUtil.getMd5Hash(user + ":" + realm + ":" + password); + String hash2 = AuthUtil.getMd5Hash("ANNOUNCE:rtsp://" + host + ":" + port + path); + String hash3 = AuthUtil.getMd5Hash(hash1 + ":" + nonce + ":" + hash2); + return "Digest username=\"" + + user + + "\",realm=\"" + + realm + + "\",nonce=\"" + + nonce + + "\",uri=\"rtsp://" + + host + + ":" + + port + + path + + "\",response=\"" + + hash3 + + "\""; + //basic auth + } else { + Log.i(TAG, "using basic auth"); + String data = user + ":" + password; + String base64Data = Base64.encodeToString(data.getBytes(), Base64.DEFAULT); + return "Basic " + base64Data; + } + } + + //Commands + + public String createOptions() { + String options = "OPTIONS rtsp://" + host + ":" + port + path + " RTSP/1.0\r\n" + addHeaders(); + Log.i(TAG, options); + return options; + } + + public String createSetup(int track) { + int[] udpPorts = track == trackVideo ? videoClientPorts : audioClientPorts; + String params = + (protocol == Protocol.UDP) ? ("UDP;unicast;client_port=" + udpPorts[0] + "-" + udpPorts[1] + ";mode=record") + : ("TCP;interleaved=" + 2 * track + "-" + (2 * track + 1) + ";mode=record"); + String setup = "SETUP rtsp://" + + host + + ":" + + port + + path + + "/trackID=" + + track + + " RTSP/1.0\r\n" + + "Transport: RTP/AVP/" + + params + + "\r\n" + + addHeaders(); + Log.i(TAG, setup); + return setup; + } + + public String createRecord() { + String record = "RECORD rtsp://" + + host + + ":" + + port + + path + + " RTSP/1.0\r\n" + + "Range: npt=0.000-\r\n" + + addHeaders(); + Log.i(TAG, record); + return record; + } + + public String createAnnounce() { + String body = createBody(); + String announce = "ANNOUNCE rtsp://" + + host + + ":" + + port + + path + + " RTSP/1.0\r\n" + + "CSeq: " + + (++cSeq) + + "\r\n" + + "Content-Length: " + + body.length() + + "\r\n" + + (authorization == null ? "" : "Authorization: " + authorization + "\r\n") + + "Content-Type: application/sdp\r\n\r\n" + + body; + Log.i(TAG, announce); + return announce; + } + + public String createAnnounceWithAuth(String authResponse) { + authorization = createAuth(authResponse); + Log.i("Auth", authorization); + String body = createBody(); + String announceAuth = "ANNOUNCE rtsp://" + + host + + ":" + + port + + path + + " RTSP/1.0\r\n" + + "CSeq: " + + (++cSeq) + + "\r\n" + + "Content-Length: " + + body.length() + + "\r\n" + + "Authorization: " + + authorization + + "\r\n" + + "Content-Type: application/sdp\r\n\r\n" + + body; + Log.i(TAG, announceAuth); + return announceAuth; + } + + public String createTeardown() { + String teardown = + "TEARDOWN rtsp://" + host + ":" + port + path + " RTSP/1.0\r\n" + addHeaders(); + Log.i(TAG, teardown); + return teardown; + } + + //Unused commands + + public static String createPause() { + return ""; + } + + public static String createPlay() { + return ""; + } + + public static String createGetParameter() { + return ""; + } + + public static String createSetParameter() { + return ""; + } + + public static String createRedirect() { + return ""; + } + + //Response parser + + public String getResponse(BufferedReader reader, ConnectCheckerRtsp connectCheckerRtsp, + boolean isAudio, boolean checkStatus) { + try { + String response = ""; + String line; + + while ((line = reader.readLine()) != null) { + if (line.contains("Session")) { + Pattern rtspPattern = Pattern.compile("Session: (\\w+)"); + Matcher matcher = rtspPattern.matcher(line); + if (matcher.find()) { + sessionId = matcher.group(1); + } + sessionId = line.split(";")[0].split(":")[1].trim(); + } + if (line.contains("server_port")) { + Pattern rtspPattern = Pattern.compile("server_port=([0-9]+)-([0-9]+)"); + Matcher matcher = rtspPattern.matcher(line); + if (matcher.find()) { + if (isAudio) { + audioServerPorts[0] = Integer.parseInt(matcher.group(1)); + audioServerPorts[1] = Integer.parseInt(matcher.group(2)); + } else { + videoServerPorts[0] = Integer.parseInt(matcher.group(1)); + videoServerPorts[1] = Integer.parseInt(matcher.group(2)); + } + } + } + response += line + "\n"; + //end of response + if (line.length() < 3) break; + } + if (checkStatus && getResponseStatus(response) != 200) { + connectCheckerRtsp.onConnectionFailedRtsp("Error configure stream, " + response); + } + Log.i(TAG, response); + return response; + } catch (IOException e) { + Log.e(TAG, "read error", e); + return null; + } + } + + public int getResponseStatus(String response) { + Matcher matcher = + Pattern.compile("RTSP/\\d.\\d (\\d+) (\\w+)", Pattern.CASE_INSENSITIVE).matcher(response); + if (matcher.find()) { + return Integer.parseInt(matcher.group(1)); + } else { + return -1; + } + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtsp/Protocol.java b/rtsp/src/main/java/com/pedro/rtsp/rtsp/Protocol.java new file mode 100644 index 0000000..c0d7c79 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtsp/Protocol.java @@ -0,0 +1,9 @@ +package com.pedro.rtsp.rtsp; + +/** + * Created by pedro on 24/02/17. + */ + +public enum Protocol { + UDP, TCP +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtsp/RtpFrame.java b/rtsp/src/main/java/com/pedro/rtsp/rtsp/RtpFrame.java new file mode 100644 index 0000000..7d22c04 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtsp/RtpFrame.java @@ -0,0 +1,77 @@ +package com.pedro.rtsp.rtsp; + +/** + * Created by pedro on 7/11/18. + */ + +public class RtpFrame { + + private byte[] buffer; + private long timeStamp; + private int length; + private int rtpPort; //rtp udp + private int rtcpPort; //rtcp udp + private byte channelIdentifier; //rtcp tcp + + public RtpFrame(byte[] buffer, long timeStamp, int length, int rtpPort, int rtcpPort, + byte channelIdentifier) { + this.buffer = buffer; + this.timeStamp = timeStamp; + this.length = length; + this.rtpPort = rtpPort; + this.rtcpPort = rtcpPort; + this.channelIdentifier = channelIdentifier; + } + + public byte[] getBuffer() { + return buffer; + } + + public void setBuffer(byte[] buffer) { + this.buffer = buffer; + } + + public long getTimeStamp() { + return timeStamp; + } + + public void setTimeStamp(long timeStamp) { + this.timeStamp = timeStamp; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getRtpPort() { + return rtpPort; + } + + public void setRtpPort(int rtpPort) { + this.rtpPort = rtpPort; + } + + public int getRtcpPort() { + return rtcpPort; + } + + public void setRtcpPort(int rtcpPort) { + this.rtcpPort = rtcpPort; + } + + public byte getChannelIdentifier() { + return channelIdentifier; + } + + public void setChannelIdentifier(byte channelIdentifier) { + this.channelIdentifier = channelIdentifier; + } + + public boolean isVideoFrame() { + return channelIdentifier == (byte) 2; + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtsp/RtspClient.java b/rtsp/src/main/java/com/pedro/rtsp/rtsp/RtspClient.java new file mode 100644 index 0000000..6ee4fdb --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtsp/RtspClient.java @@ -0,0 +1,330 @@ +package com.pedro.rtsp.rtsp; + +import android.media.MediaCodec; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import com.pedro.rtsp.utils.ConnectCheckerRtsp; +import com.pedro.rtsp.utils.CreateSSLSocket; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by pedro on 10/02/17. + */ + +public class RtspClient { + + private final String TAG = "RtspClient"; + private static final Pattern rtspUrlPattern = + Pattern.compile("^rtsps?://([^/:]+)(?::(\\d+))*/([^/]+)/?([^*]*)$"); + + private ConnectCheckerRtsp connectCheckerRtsp; + //sockets objects + private Socket connectionSocket; + private BufferedReader reader; + private BufferedWriter writer; + private Thread thread; + //for tcp + private OutputStream outputStream; + private volatile boolean streaming = false; + //for secure transport + private boolean tlsEnabled = false; + private RtspSender rtspSender; + private String url; + private CommandsManager commandsManager; + private int numRetry; + private int reTries; + private Handler handler; + private Runnable runnable; + + public RtspClient(ConnectCheckerRtsp connectCheckerRtsp) { + this.connectCheckerRtsp = connectCheckerRtsp; + commandsManager = new CommandsManager(); + rtspSender = new RtspSender(connectCheckerRtsp); + handler = new Handler(Looper.getMainLooper()); + } + + public void setOnlyAudio(boolean onlyAudio) { + commandsManager.setOnlyAudio(onlyAudio); + } + + public void setProtocol(Protocol protocol) { + commandsManager.setProtocol(protocol); + } + + public void setAuthorization(String user, String password) { + commandsManager.setAuth(user, password); + } + + public void setReTries(int reTries) { + numRetry = reTries; + this.reTries = reTries; + } + + public boolean shouldRetry(String reason) { + boolean validReason = !reason.contains("Endpoint malformed"); + return validReason && reTries > 0; + } + + public boolean isStreaming() { + return streaming; + } + + public void setUrl(String url) { + this.url = url; + } + + public void setSampleRate(int sampleRate) { + commandsManager.setSampleRate(sampleRate); + } + + public String getHost() { + return commandsManager.getHost(); + } + + public int getPort() { + return commandsManager.getPort(); + } + + public String getPath() { + return commandsManager.getPath(); + } + + public ConnectCheckerRtsp getConnectCheckerRtsp() { + return connectCheckerRtsp; + } + + public void setSPSandPPS(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { + commandsManager.setVideoInfo(sps, pps, vps); + } + + public void setIsStereo(boolean isStereo) { + commandsManager.setIsStereo(isStereo); + } + + public void connect() { + if (!streaming) { + Matcher rtspMatcher = rtspUrlPattern.matcher(url); + if (rtspMatcher.matches()) { + tlsEnabled = rtspMatcher.group(0).startsWith("rtsps"); + } else { + streaming = false; + connectCheckerRtsp.onConnectionFailedRtsp( + "Endpoint malformed, should be: rtsp://ip:port/appname/streamname"); + return; + } + String host = rtspMatcher.group(1); + int port = Integer.parseInt((rtspMatcher.group(2) != null) ? rtspMatcher.group(2) : "554"); + String path = "/" + rtspMatcher.group(3) + "/" + rtspMatcher.group(4); + commandsManager.setUrl(host, port, path); + + rtspSender.setSocketsInfo(commandsManager.getProtocol(), + commandsManager.getVideoClientPorts(), commandsManager.getAudioClientPorts()); + rtspSender.setAudioInfo(commandsManager.getSampleRate()); + if (!commandsManager.isOnlyAudio()) { + rtspSender.setVideoInfo(commandsManager.getSps(), commandsManager.getPps(), + commandsManager.getVps()); + } + thread = new Thread(new Runnable() { + @Override + public void run() { + try { + if (!tlsEnabled) { + connectionSocket = new Socket(); + SocketAddress socketAddress = + new InetSocketAddress(commandsManager.getHost(), commandsManager.getPort()); + connectionSocket.connect(socketAddress, 5000); + } else { + connectionSocket = CreateSSLSocket.createSSlSocket(commandsManager.getHost(), + commandsManager.getPort()); + if (connectionSocket == null) throw new IOException("Socket creation failed"); + } + connectionSocket.setSoTimeout(5000); + reader = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); + outputStream = connectionSocket.getOutputStream(); + writer = new BufferedWriter(new OutputStreamWriter(outputStream)); + writer.write(commandsManager.createOptions()); + writer.flush(); + commandsManager.getResponse(reader, connectCheckerRtsp, false, false); + writer.write(commandsManager.createAnnounce()); + writer.flush(); + //check if you need credential for stream, if you need try connect with credential + String response = commandsManager.getResponse(reader, connectCheckerRtsp, false, false); + int status = commandsManager.getResponseStatus(response); + if (status == 403) { + connectCheckerRtsp.onConnectionFailedRtsp("Error configure stream, access denied"); + Log.e(TAG, "Response 403, access denied"); + return; + } else if (status == 401) { + if (commandsManager.getUser() == null || commandsManager.getPassword() == null) { + connectCheckerRtsp.onAuthErrorRtsp(); + return; + } else { + writer.write(commandsManager.createAnnounceWithAuth(response)); + writer.flush(); + int statusAuth = commandsManager.getResponseStatus( + commandsManager.getResponse(reader, connectCheckerRtsp, false, false)); + if (statusAuth == 401) { + connectCheckerRtsp.onAuthErrorRtsp(); + return; + } else if (statusAuth == 200) { + connectCheckerRtsp.onAuthSuccessRtsp(); + } else { + connectCheckerRtsp.onConnectionFailedRtsp( + "Error configure stream, announce with auth failed"); + } + } + } else if (status != 200) { + connectCheckerRtsp.onConnectionFailedRtsp("Error configure stream, announce failed"); + } + writer.write(commandsManager.createSetup(commandsManager.getTrackAudio())); + writer.flush(); + commandsManager.getResponse(reader, connectCheckerRtsp, true, true); + if (!commandsManager.isOnlyAudio()) { + writer.write(commandsManager.createSetup(commandsManager.getTrackVideo())); + writer.flush(); + commandsManager.getResponse(reader, connectCheckerRtsp, false, true); + } + writer.write(commandsManager.createRecord()); + writer.flush(); + commandsManager.getResponse(reader, connectCheckerRtsp, false, true); + + rtspSender.setDataStream(outputStream, commandsManager.getHost()); + int[] videoPorts = commandsManager.getVideoServerPorts(); + int[] audioPorts = commandsManager.getAudioServerPorts(); + if (!commandsManager.isOnlyAudio()) { + rtspSender.setVideoPorts(videoPorts[0], videoPorts[1]); + } + rtspSender.setAudioPorts(audioPorts[0], audioPorts[1]); + rtspSender.start(); + streaming = true; + reTries = numRetry; + connectCheckerRtsp.onConnectionSuccessRtsp(); + } catch (IOException | NullPointerException e) { + Log.e(TAG, "connection error", e); + connectCheckerRtsp.onConnectionFailedRtsp("Error configure stream, " + e.getMessage()); + streaming = false; + } + } + }); + thread.start(); + } + } + + public void disconnect() { + handler.removeCallbacks(runnable); + disconnect(true); + } + + private void disconnect(final boolean clear) { + if (streaming) rtspSender.stop(); + streaming = false; + thread = new Thread(new Runnable() { + @Override + public void run() { + try { + if (writer != null) { + writer.write(commandsManager.createTeardown()); + writer.flush(); + if (clear) { + commandsManager.clear(); + } else { + commandsManager.retryClear(); + } + } + if (connectionSocket != null) connectionSocket.close(); + writer = null; + connectionSocket = null; + } catch (IOException e) { + if (clear) { + commandsManager.clear(); + } else { + commandsManager.retryClear(); + } + Log.e(TAG, "disconnect error", e); + } + } + }); + thread.start(); + if (clear) { + reTries = 0; + connectCheckerRtsp.onDisconnectRtsp(); + } + } + + public void sendVideo(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + if (isStreaming() && !commandsManager.isOnlyAudio()) { + rtspSender.sendVideoFrame(h264Buffer, info); + } + } + + public void sendAudio(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + if (isStreaming()) { + rtspSender.sendAudioFrame(aacBuffer, info); + } + } + + public void reConnect(long delay) { + reTries--; + disconnect(false); + runnable = new Runnable() { + @Override + public void run() { + connect(); + } + }; + handler.postDelayed(runnable, delay); + } + + public long getDroppedAudioFrames() { + return rtspSender.getDroppedAudioFrames(); + } + + public long getDroppedVideoFrames() { + return rtspSender.getDroppedVideoFrames(); + } + + public void resetSentAudioFrames() { + rtspSender.resetSentAudioFrames(); + } + + public void resetSentVideoFrames() { + rtspSender.resetSentVideoFrames(); + } + + public void resetDroppedAudioFrames() { + rtspSender.resetDroppedAudioFrames(); + } + + public void resetDroppedVideoFrames() { + rtspSender.resetDroppedVideoFrames(); + } + + public void resizeCache(int newSize) throws RuntimeException { + rtspSender.resizeCache(newSize); + } + + public int getCacheSize() { + return rtspSender.getCacheSize(); + } + + public long getSentAudioFrames() { + return rtspSender.getSentAudioFrames(); + } + + public long getSentVideoFrames() { + return rtspSender.getSentVideoFrames(); + } +} + diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtsp/RtspSender.java b/rtsp/src/main/java/com/pedro/rtsp/rtsp/RtspSender.java new file mode 100644 index 0000000..26487fc --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtsp/RtspSender.java @@ -0,0 +1,213 @@ +package com.pedro.rtsp.rtsp; + +import android.media.MediaCodec; +import android.util.Log; +import com.pedro.rtsp.rtcp.BaseSenderReport; +import com.pedro.rtsp.rtp.packets.AacPacket; +import com.pedro.rtsp.rtp.packets.AudioPacketCallback; +import com.pedro.rtsp.rtp.packets.BasePacket; +import com.pedro.rtsp.rtp.packets.H264Packet; +import com.pedro.rtsp.rtp.packets.H265Packet; +import com.pedro.rtsp.rtp.packets.VideoPacketCallback; +import com.pedro.rtsp.rtp.sockets.BaseRtpSocket; +import com.pedro.rtsp.utils.BitrateManager; +import com.pedro.rtsp.utils.ConnectCheckerRtsp; +import com.pedro.rtsp.utils.RtpConstants; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +/** + * Created by pedro on 7/11/18. + */ + +public class RtspSender implements VideoPacketCallback, AudioPacketCallback { + + private final static String TAG = "RtspSender"; + private BasePacket videoPacket; + private AacPacket aacPacket; + private BaseRtpSocket rtpSocket; + private BaseSenderReport baseSenderReport; + private volatile BlockingQueue rtpFrameBlockingQueue = + new LinkedBlockingQueue<>(getDefaultCacheSize()); + private Thread thread; + private ConnectCheckerRtsp connectCheckerRtsp; + private long audioFramesSent = 0; + private long videoFramesSent = 0; + private long droppedAudioFrames = 0; + private long droppedVideoFrames = 0; + private BitrateManager bitrateManager; + + public RtspSender(ConnectCheckerRtsp connectCheckerRtsp) { + this.connectCheckerRtsp = connectCheckerRtsp; + bitrateManager = new BitrateManager(connectCheckerRtsp); + } + + public void setSocketsInfo(Protocol protocol, int[] videoSourcePorts, int[] audioSourcePorts) { + rtpSocket = BaseRtpSocket.getInstance(protocol, videoSourcePorts[0], audioSourcePorts[0]); + baseSenderReport = + BaseSenderReport.getInstance(protocol, videoSourcePorts[1], audioSourcePorts[1]); + } + + public void setVideoInfo(byte[] sps, byte[] pps, byte[] vps) { + videoPacket = + vps == null ? new H264Packet(sps, pps, this) : new H265Packet(sps, pps, vps, this); + } + + public void setAudioInfo(int sampleRate) { + aacPacket = new AacPacket(sampleRate, this); + } + + /** + * @return number of packets + */ + private int getDefaultCacheSize() { + return 10 * 1024 * 1024 / RtpConstants.MTU; + } + + public void setDataStream(OutputStream outputStream, String host) { + rtpSocket.setDataStream(outputStream, host); + baseSenderReport.setDataStream(outputStream, host); + } + + public void setVideoPorts(int rtpPort, int rtcpPort) { + videoPacket.setPorts(rtpPort, rtcpPort); + } + + public void setAudioPorts(int rtpPort, int rtcpPort) { + aacPacket.setPorts(rtpPort, rtcpPort); + } + + public void sendVideoFrame(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { + videoPacket.createAndSendPacket(h264Buffer, info); + } + + public void sendAudioFrame(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { + aacPacket.createAndSendPacket(aacBuffer, info); + } + + @Override + public void onVideoFrameCreated(RtpFrame rtpFrame) { + try { + rtpFrameBlockingQueue.add(rtpFrame); + } catch (IllegalStateException e) { + Log.i(TAG, "Video frame discarded"); + droppedVideoFrames++; + } + } + + @Override + public void onAudioFrameCreated(RtpFrame rtpFrame) { + try { + rtpFrameBlockingQueue.add(rtpFrame); + } catch (IllegalStateException e) { + Log.i(TAG, "Audio frame discarded"); + droppedAudioFrames++; + } + } + + public void start() { + thread = new Thread(new Runnable() { + @Override + public void run() { + while (!Thread.interrupted()) { + try { + RtpFrame rtpFrame = rtpFrameBlockingQueue.poll(1, TimeUnit.SECONDS); + if (rtpFrame == null) { + Log.i(TAG, "Skipping iteration, frame null"); + continue; + } + rtpSocket.sendFrame(rtpFrame); + //bytes to bits + bitrateManager.calculateBitrate(rtpFrame.getLength() * 8); + if (rtpFrame.isVideoFrame()) { + videoFramesSent++; + } else { + audioFramesSent++; + } + baseSenderReport.update(rtpFrame); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (IOException e) { + Thread.currentThread().interrupt(); + Log.e(TAG, "send error: ", e); + connectCheckerRtsp.onConnectionFailedRtsp("Error send packet, " + e.getMessage()); + } + } + } + }); + thread.start(); + } + + public void stop() { + if (thread != null) { + thread.interrupt(); + try { + thread.join(100); + } catch (InterruptedException e) { + thread.interrupt(); + } + thread = null; + } + rtpFrameBlockingQueue.clear(); + baseSenderReport.reset(); + baseSenderReport.close(); + rtpSocket.close(); + aacPacket.reset(); + if (videoPacket != null) videoPacket.reset(); + + resetSentAudioFrames(); + resetSentVideoFrames(); + resetDroppedAudioFrames(); + resetDroppedVideoFrames(); + } + + public void resizeCache(int newSize) { + if (newSize < rtpFrameBlockingQueue.size() - rtpFrameBlockingQueue.remainingCapacity()) { + throw new RuntimeException("Can't fit current cache inside new cache size"); + } + + BlockingQueue tempQueue = new LinkedBlockingQueue<>(newSize); + rtpFrameBlockingQueue.drainTo(tempQueue); + rtpFrameBlockingQueue = tempQueue; + } + + public int getCacheSize() { + return rtpFrameBlockingQueue.size(); + } + + public long getSentAudioFrames() { + return audioFramesSent; + } + + public long getSentVideoFrames() { + return videoFramesSent; + } + + public long getDroppedAudioFrames() { + return droppedAudioFrames; + } + + public long getDroppedVideoFrames() { + return droppedVideoFrames; + } + + public void resetSentAudioFrames() { + audioFramesSent = 0; + } + + public void resetSentVideoFrames() { + videoFramesSent = 0; + } + + public void resetDroppedAudioFrames() { + droppedAudioFrames = 0; + } + + public void resetDroppedVideoFrames() { + droppedVideoFrames = 0; + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/rtsp/VideoCodec.java b/rtsp/src/main/java/com/pedro/rtsp/rtsp/VideoCodec.java new file mode 100644 index 0000000..766eee5 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/rtsp/VideoCodec.java @@ -0,0 +1,9 @@ +package com.pedro.rtsp.rtsp; + +/** + * Created by pedro on 28/11/18. + */ + +public enum VideoCodec { + H264, H265 +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/utils/AuthUtil.java b/rtsp/src/main/java/com/pedro/rtsp/utils/AuthUtil.java new file mode 100644 index 0000000..a3ba03a --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/utils/AuthUtil.java @@ -0,0 +1,36 @@ +package com.pedro.rtsp.utils; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * Created by pedro on 22/02/17. + */ + +public class AuthUtil { + + private static char[] hexArray = + { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + + public static String getMd5Hash(String buffer) { + MessageDigest md; + try { + md = MessageDigest.getInstance("MD5"); + return bytesToHex(md.digest(buffer.getBytes("UTF-8"))); + } catch (NoSuchAlgorithmException | UnsupportedEncodingException ignore) { + } + return ""; + } + + private static String bytesToHex(byte[] bytes) { + char[] hexChars = new char[bytes.length * 2]; + int v; + for (int j = 0; j < bytes.length; j++) { + v = bytes[j] & 0xFF; + hexChars[j * 2] = hexArray[v >>> 4]; + hexChars[j * 2 + 1] = hexArray[v & 0x0F]; + } + return new String(hexChars); + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/utils/BitrateManager.java b/rtsp/src/main/java/com/pedro/rtsp/utils/BitrateManager.java new file mode 100644 index 0000000..ca11132 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/utils/BitrateManager.java @@ -0,0 +1,27 @@ +package com.pedro.rtsp.utils; + +/** + * Created by pedro on 10/07/19. + * + * Calculate video and audio bitrate per second + */ +public class BitrateManager { + + private long bitrate; + private long timeStamp = System.currentTimeMillis(); + private ConnectCheckerRtsp connectCheckerRtsp; + + public BitrateManager(ConnectCheckerRtsp connectCheckerRtsp) { + this.connectCheckerRtsp = connectCheckerRtsp; + } + + public synchronized void calculateBitrate(long size) { + bitrate += size; + long timeDiff = System.currentTimeMillis() - timeStamp; + if (timeDiff >= 1000) { + connectCheckerRtsp.onNewBitrateRtsp((int) (bitrate / (timeDiff / 1000f))); + timeStamp = System.currentTimeMillis(); + bitrate = 0; + } + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/utils/ConnectCheckerRtsp.java b/rtsp/src/main/java/com/pedro/rtsp/utils/ConnectCheckerRtsp.java new file mode 100644 index 0000000..ef86aaa --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/utils/ConnectCheckerRtsp.java @@ -0,0 +1,20 @@ +package com.pedro.rtsp.utils; + +/** + * Created by pedro on 20/02/17. + */ + +public interface ConnectCheckerRtsp { + + void onConnectionSuccessRtsp(); + + void onConnectionFailedRtsp(String reason); + + void onNewBitrateRtsp(long bitrate); + + void onDisconnectRtsp(); + + void onAuthErrorRtsp(); + + void onAuthSuccessRtsp(); +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/utils/CreateSSLSocket.java b/rtsp/src/main/java/com/pedro/rtsp/utils/CreateSSLSocket.java new file mode 100644 index 0000000..9b39851 --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/utils/CreateSSLSocket.java @@ -0,0 +1,31 @@ +package com.pedro.rtsp.utils; + +import android.util.Log; +import java.io.IOException; +import java.net.Socket; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; + +/** + * Created by pedro on 25/02/17. + * + * this class is used for secure transport, to use replace socket on RtmpConnection with this and + * you will have a secure stream under ssl/tls. + */ + +public class CreateSSLSocket { + + /** + * @param host variable from RtspConnection + * @param port variable from RtspConnection + */ + public static Socket createSSlSocket(String host, int port) { + try { + TLSSocketFactory socketFactory = new TLSSocketFactory(); + return socketFactory.createSocket(host, port); + } catch (NoSuchAlgorithmException | KeyManagementException | IOException e) { + Log.e("CreateSSLSocket", "Error", e); + return null; + } + } +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/utils/RtpConstants.java b/rtsp/src/main/java/com/pedro/rtsp/utils/RtpConstants.java new file mode 100644 index 0000000..d01d2ba --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/utils/RtpConstants.java @@ -0,0 +1,17 @@ +package com.pedro.rtsp.utils; + +/** + * Created by pedro on 19/02/17. + */ + +public class RtpConstants { + public static final long clockVideoFrequency = 90000L; + public static final int RTP_HEADER_LENGTH = 12; + public static final int MTU = 1300; + public static final int payloadType = 96; + //H264 IDR + public static final int IDR = 5; + //H265 IDR + public static final int IDR_N_LP = 20; + public static final int IDR_W_DLP = 19; +} diff --git a/rtsp/src/main/java/com/pedro/rtsp/utils/TLSSocketFactory.java b/rtsp/src/main/java/com/pedro/rtsp/utils/TLSSocketFactory.java new file mode 100644 index 0000000..349824e --- /dev/null +++ b/rtsp/src/main/java/com/pedro/rtsp/utils/TLSSocketFactory.java @@ -0,0 +1,77 @@ +package com.pedro.rtsp.utils; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.net.UnknownHostException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +/** + * @author fkrauthan + */ +public class TLSSocketFactory extends SSLSocketFactory { + + private SSLSocketFactory internalSSLSocketFactory; + + public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException { + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, null, null); + internalSSLSocketFactory = context.getSocketFactory(); + } + + @Override + public String[] getDefaultCipherSuites() { + return internalSSLSocketFactory.getDefaultCipherSuites(); + } + + @Override + public String[] getSupportedCipherSuites() { + return internalSSLSocketFactory.getSupportedCipherSuites(); + } + + @Override + public Socket createSocket() throws IOException { + return enableTLSOnSocket(internalSSLSocketFactory.createSocket()); + } + + @Override + public Socket createSocket(Socket s, String host, int port, boolean autoClose) + throws IOException { + return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)); + } + + @Override + public Socket createSocket(String host, int port) throws IOException, UnknownHostException { + return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); + } + + @Override + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) + throws IOException, UnknownHostException { + return enableTLSOnSocket( + internalSSLSocketFactory.createSocket(host, port, localHost, localPort)); + } + + @Override + public Socket createSocket(InetAddress host, int port) throws IOException { + return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); + } + + @Override + public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) + throws IOException { + return enableTLSOnSocket( + internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)); + } + + private Socket enableTLSOnSocket(Socket socket) { + if (socket != null && (socket instanceof SSLSocket)) { + ((SSLSocket) socket).setEnabledProtocols(new String[] { "TLSv1.1", "TLSv1.2" }); + } + return socket; + } +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..be6e17b --- /dev/null +++ b/settings.gradle @@ -0,0 +1,6 @@ +include ':rtsp' +include ':rtplibrary' +include ':rtmp' +include ':encoder' +include ':app' +rootProject.name = "Peeriscope" \ No newline at end of file